Один или несколько классов репозитория? - PullRequest
12 голосов
/ 31 июля 2011

Моя база данных относительно мала, 8 таблиц, каждая из которых содержит менее 5 столбцов.Я использую EF.Я создал один класс репозитория, но теперь я думаю, что это может быть неправильный способ его использования.Должен ли я иметь отдельный класс репозитория для каждого из моих контроллеров?Допустим, у меня есть Products, Users, Unicorns. Было бы хорошо иметь один класс репозитория для работы со всеми из них и создания экземпляров в каждом из этих контроллеров, или я должен создать отдельный класс репозитория для каждого из них?

Ответы [ 3 ]

10 голосов
/ 31 июля 2011

Одной из ключевых концепций DDD является совокупный корень - это сущность «верхнего уровня», с помощью которой вы управляете целыми наборами связанных сущностей.

Например, в сценарии розничной торговли «Заказ» будет представлять собой совокупный корень, через который вы можете получить доступ к самому Заказу, списку элементов OrderItem (т. Е. Модификаторов Product + Amount +, таких как скидки), BillingAddress, ShippingAddress и PaymentMethod. Каждый из них тесно связан с самим заказом, до такой степени, что у них нет причин существовать за рамками заказа.

Каждый сводный корень должен иметь репозиторий, который отвечает за сохранение всего подграфа объектов под корнем. Таким образом, в приведенном выше примере вы НЕ хотели бы или нуждались в репозитории для OrderItems, который позволяет независимо получать доступ к элементам заказа; вместо этого вы должны реализовать единый репозиторий OrdersRepository, который обрабатывает Orders и все их подкомпоненты как единое целое.

В зависимости от вашей конкретной доменной модели вам может понадобиться одно или несколько хранилищ, но, конечно, не одно для каждого типа сущности. Ключевой вопрос, который нужно задать при поиске совокупных корней: «Есть ли у этой сущности собственная идентичность и жизненный цикл?» Заказы делают, OrderItems нет.

2 голосов
/ 31 июля 2011

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

Не всем аспектам может потребоваться хранилище, но это то, что вы решаете.

1 голос
/ 31 июля 2011

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

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