Должны ли репозитории предоставлять все данные сервисам? - PullRequest
1 голос
/ 08 марта 2011

Я имею в виду, что у меня в хранилище есть метод:

Public Function GetCustomerByState(ByVal State As String) As IQueryable(Of Customer)

Если служба сможет получить дополнительные данные в виде, скажем, этого расширения, например, получить заказы для клиента:

<Extension()> _
    Public Function Include(Of T)(ByVal Source As IQueryable(Of T), ByVal Path As String) As IQueryable(Of T)
        Dim ObjectQuery = CType(Source, ObjectQuery(Of T))
        If (ObjectQuery IsNot Nothing) Then
            Return ObjectQuery.Include(Path)
        End If
        Return Source

    End Function

Это расширение, скорее всего, используется с общим репозиторием.

Или у вас должны быть конкретные реализации репозиториев для каждого агрегатного корня, которые возвращают службе именно то, что ей нужно, и ничего более или менее?

Тогда, должны ли ваши репозитории даже возвращать IQueryable?

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Я бы предложил только ограниченный набор методов, таких как:

IQueryable<T> GetQuery();
T GetByKey(K key);

Причина в том, что репозиторий используется для обеспечения абстракции доступа к данным к корням агрегации, но бизнес-логика отвечает за определение того, какие данные следует извлекать. Если вы передадите слишком много логики в хранилище, вы разделите логику между службой и хранилищем. Более того, большинство ваших методов поиска данных в сервисе ничего не сделают - они просто вызовут метод репозитория.

Мартин Фаулер говорит это ясно:

Репозиторий является посредником между домены и слои отображения данных, действующие как объект домена в памяти коллекция. Конструкция объектов клиента спецификации запросов декларативно и отправить их в хранилище для удовлетворение.

В последние годы шаблоны Repository и UnitOfWork стали очень популярными в мире .NET. Но никто не говорит о третьем паттерне из этого семейства - Спецификация . Спецификация - это сокращенный запрос, передаваемый в хранилище, чтобы определить, какие данные должны быть возвращены. Мир .NET не использует этот шаблон явно, потому что запросы IMO Linq-To-Entities являются спецификациями.

1 голос
/ 08 марта 2011

Я бы вернул все необходимое для сервиса из репозитория.Это хорошая практика, которая не позволит вам писать повторяющиеся запросы.Я написал SO-ответ о репозитории с EF Code First, который может помочь: Entity Framework 4 CTP 4 / CTP 5 Универсальный шаблон репозитория и тестируемый модуль

Просто примечание - существует МНОГИЕ различные реализациишаблона Repository и поиск решения, которое "чувствует" правильно, - это то, что я бы порекомендовал.В небольших проектах вы можете вернуть IQueryable, но если он вырастет, вы можете сожалеть о решении по проекту, так как становится трудно сохранять вещи СУХИМЫМИ.

...