Вы можете потратить некоторое время на чтение агрегатов и корней агрегатов.
Что такое совокупный корень?
Определите одну из ваших сущностей как корень и попробуйте и посмотрите, подходит ли она вашим сценариям.Я приведу вам пример.Это очень сложно, не зная ваших сценариев, хотя, поэтому посмотрим на это в качестве примера:
Я использую сводный корень Companyas.
Company
Name:string
Projects:IList<Project>
Project
ProjectName:string
Resources:IList<Resource>
Projecthead:Employee
Resource
Employee:Employee
(ResourceType probably)
Employee
Name
(идентификаторы опущены, но, вероятно, будут в некотором базовом классеесли вы хотите, чтобы БД сохранялась)
Теперь вы должны убедиться, что у вас есть доступ к этому Агрегированному корню только через корневую Компанию.Речь идет об изоляции, и кажется довольно странным, что вы больше не можете делать такой метод, как user.GetAllMyProjects (), но это облегчит вам задачу позже.Вместо этого вы можете создать метод наподобие project.HasGivenUserAccess (пользовательский пользователь).Это, вероятно, достаточно, но это зависит от ваших сценариев.
Не стесняйтесь атаковать этот дизайн по какому-то сценарию, который, как вы думаете, он не обрабатывает, и я отредактирую свой пост.