Шаблон репозитория и несколько связанных базовых объектов или бизнес-объектов - один репозиторий или несколько? - PullRequest
17 голосов
/ 24 февраля 2010

Я смотрю на реализацию шаблона репозитория (поскольку в любом случае я придумал его реализацию на 90%) и натолкнулся на вопрос проектирования - где у меня есть два или более основных бизнес-объекта (например, Business и Контакт в приложении CRM), BO могут быть сильно связаны или не связаны вообще.

В этой ситуации я должен реализовать один репозиторий (например, CrmRepository с .addBusiness (), .addContact () и др.) Или несколько репозиториев (BusinessRepository, ContactRepository, каждый со своими собственными .add (), .delete ( ) и др.).

Какова лучшая практика в этой ситуации?

Базовым DAL является EF4.

Привет

Moo

Ответы [ 2 ]

23 голосов
/ 25 февраля 2010

В последнее время мы много размышляли над своей работой и наткнулись на несколько статей, которые помогли нам визуализировать и спроектировать наши хранилища согласованным образом.

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

С вашей информацией в вашем вопросе кажется, что Бизнес будет совокупным корнем и, следовательно, Типом сущности и потребует своего собственного хранилища. Так как Контакт может жить независимо, это может быть и совокупный корень. Оба объекта могут иметь ссылки друг на друга и использовать репозиторий для загрузки предприятий из контакта или загрузки контактов из бизнеса через соответствующий репозиторий.

В последнее время я много читаю, поэтому надеюсь, что у меня был какой-то смысл в моем мыслительном процессе.

Некоторые ссылки

Совокупный корень

Сущности, объекты-значения, агрегаты и корни

6 голосов
/ 25 февраля 2010

Я полностью согласен с Марком в этом, но добавлю немного больше. Когда вы посмотрите на преимущества создания универсального репозитория, общий шаблон - это IRepository и Repository. Одна вещь, которую я нахожу гораздо более полезной, раскрытая Джереми Д. Миллером (не могу найти ссылку), - это наличие дженериков на уровне метода.

Так что у моего IReposity будут такие методы:

T FindByKey<T>(int key);
IEnumerable<T> FindAll();
T FindBy<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression);
void Update<T>(entity);

Затем, в зависимости от вашей философии, вы можете передать класс Repository и напрямую запросить его, или сделать реализацию Repository абстрактной и принудительно инкапсулировать ее использование в явном хранилище, например:

CrmRepository : Repository
{
   FindByCustomerId(int customerId)
   { return FindByKey<Customer>(customerId);}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...