Подтвердить что ты не робот

Шаблон хранилища и несколько связанных основных объектов или бизнес-объектов - один репозиторий или более?

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

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

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

В основе DAL лежит EF4.

Привет

Му

4b9b3361

Ответ 1

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

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

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

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

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

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

Объекты, объекты значений, агрегаты и корни

Ответ 2

Я полностью согласен с Марком в этом, но добавлю немного больше. Когда вы смотрите на преимущества создания общего репозитория, общим паттером является 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);

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

CrmRepository : Repository
{
   FindByCustomerId(int customerId)
   { return FindByKey<Customer>(customerId);}
}