Я вообще согласен с Мошем в этом. Однако имейте в виду понятие транзакций с точки зрения бизнеса. Таким образом, я на самом деле понимаю, что «с целью изменения данных» означает «с целью транзакции (транзакций)».
Репозитории являются представлениями модели предметной области. В доменной среде эти «представления» действительно поддерживают или представляют бизнес-функцию или возможность - транзакцию. В данном случае Сотрудник может иметь одно или несколько нарушений, и, если это так, являются аспектами транзакции (транзакций) в определенный момент времени. Рассмотрим ваши варианты использования.
Сценарий: «Сотрудник совершает действие, которое является нарушением рабочего места». Это тип бизнес-события (то есть транзакция или часть более крупной, возможно, распределенной транзакции), которая произошла. Доменный объект, подверженный влиянию корня, на самом деле можно рассматривать с нескольких точек зрения, поэтому он сбивает с толку. Но следует помнить о поведении, которое относится к бизнес-транзакциям, поскольку вы хотите, чтобы ваши бизнес-процессы моделировали реальный мир как можно точнее. С точки зрения отношений, как и в реляционной базе данных, ваша концептуальная модель предметной области должна фактически указывать это уже (т.е. ассоциативность), которую часто можно прочитать в любом направлении:
Сотрудник <---- совершает ------- совершил ----> Нарушение
Таким образом, для этого варианта использования было бы справедливо сказать, что это транзакция, имеющая дело с нарушениями, и что корневая (или "основная" сущность) является нарушением. Тогда это будет ваш совокупный корень, на который вы будете ссылаться для этой конкретной бизнес-деятельности или бизнес-процесса. Но это не означает, что для другой операции или процесса у вас не может быть совокупного корня Employee, такого как «новый процесс сотрудника». Если вы позаботитесь о том, чтобы циклические ссылки не оказывали негативного влияния и не могли обходить модель вашего домена несколькими способами. Однако я предупрежу, что управление этим вопросом должно быть продумано и обработано вашим контроллером в вашей области бизнеса или любым другим аналогом, который у вас есть.
В сторону: если рассматривать шаблоны (например, MVC), хранилище является представлением, доменные объекты являются моделью, и, следовательно, следует также использовать некоторую форму шаблона контроллера. Как правило, контроллер объявляет конкретную реализацию и доступ к репозиториям (коллекции совокупных корней).
В мире доступа к данным ...
Используя LINQ-To-SQL в качестве примера, DataContext будет контроллером, отображающим представление сущностей Customer и Order. Представление представляет собой не декларативный, ориентированный на фреймворк тип таблицы (грубый эквивалент репозитория). Обратите внимание, что представление сохраняет ссылку на свой родительский контроллер и часто проходит через контроллер, чтобы контролировать, как / когда представление материализуется. Таким образом, контроллер - ваш поставщик, который заботится о картографировании, трансляции, гидратации объектов и т. Д. Затем модель является вашими POCO данных. Довольно типичный паттерн MVC.
Используя N / Hibernate в качестве примера, ISession будет контроллером, отображающим представление сущностей Customer и Order посредством session.Enumerable (string query) или session.Get (идентификатор объекта) или session.CreateCriteria (typeof) (Заказчик)). Список ()
В мире бизнес-логики ...
Customer { /*...*/ }
Employee { /*...*/ }
Repository<T> : IRepository<T>
, IEnumerable<T>
//, IQueryable<T>, IQueryProvider //optional
{ /**/ }
BusinessController {
Repository<Customer> Customers { get{ /*...*/ }} //aggregate root
Repository<Order> Orders { get{ /*...*/ }} // aggregate root
}
В двух словах, пусть ваши бизнес-процессы и транзакции будут руководством, и пусть ваша бизнес-инфраструктура естественным образом развивается по мере того, как процессы / действия реализуются или реорганизуются. Кроме того, предпочитайте комбинируемость традиционному дизайну черного ящика. Когда вы доберетесь до сервис-ориентированных или облачных вычислений, вы будете рады, что сделали это. :)