Является ли хорошей практикой использование в моих методах репозитория объединений и других сложных операций? - PullRequest
0 голосов
/ 15 февраля 2012

Я занимаюсь разработкой приложения в ASP.NET MVC3 на C #.

В настоящее время я создаю свой DAL , состоящий из ADO.NET EF и класса репозитория MyDBRepository:

public class MyDBRepository
{
    MyDBEntities myDB;

    public MinervaDBRepository()
    {
        myDB = new MyDBEntities();
    }

    //methods
}

Я все еще не уверен в степени детализации запросов, выполняемых методами MyDBRepository. Я знаю, что этот запрос уместен в репозитории:

public IQueryable<Products> GetAllTickets()
{
     return myDB.products;
}

А как насчет тех, кто использует , присоединяет через свойства навигации или запрашивает методы из других классов ? Примеры:

Этот метод извлекает продукты, отклоненные до определенной даты (дата хранится в виде строки в БД), и использует созданный мной класс DateUtilities:

public IQueryable<Products> GetProductsDismissed(DateTime date) 
{
        return myDB.products.Where(m => (string.IsNullOrEmpty(m.ProductDismissDate) || 
                                        Equals(m.ProductDismissDate, "-")) ? false :
              (DateTime.Compare(date, DateUtilities.ConvertToDateTime(m.ProductDismissDate)) > 0));
}

Этот метод выполняет объединение с использованием навигационных свойств для извлечения всех частей, составляющих продукт (предположим, существует отношение 1 ко многим ):

 public IQueryable<Products> GetAllProductParts(int productId)
    {
        return myDB.products.Where(m => Equals(m.ProductId, productId));
    }

Они должны быть реализованы в Repository class или лучше (один или оба) перейти на Service Layer ?

1 Ответ

1 голос
/ 16 февраля 2012

Репозиторий инкапсулирует слой персистентности, это нормально для реализации всех вещей, связанных с базой данных. Реализация на самом деле не имеет значения для остальной части приложения, поэтому в первую очередь вы используете репозиторий. Единственное, что я бы предложил изменить - это вернуть непосредственно IEnumerable, а не IQueryable.

Между ними есть разница, но в этом случае это не имеет значения, и использование IQueryable означает, что в будущем сложнее изменить постоянный доступ (возможно, вы захотите переключиться на микроформу или изменить СУБД, драйвер которой не например, не поддерживает IQueryable или просто использует облачное хранилище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...