我正在尝试使用域驱动设计,同时创建一个可公开访问的网站。我遇到的一个问题是试图弄清楚我的模型的聚合根应该是什么。我非常清楚哪些对象是实体对象,哪些对象是值对象。
我的站点与大多数公共站点一样,不允许每个用户查看存储在站点中的每条信息。相反,他们只能看到自己拥有的信息。对于我的站点,用户将创建“项目”,他们也可以与其他用户共享。然而,用户仍然只能看到他们创建或受邀加入的项目中的信息。我的模型中的所有其他对象都存在于一个项目中,如果一个项目被删除,它包含的所有对象也应该被删除。
那么这是否意味着我应该拥有一个主要的“Project”聚合根类型和一个“ProjectRepository”存储库?每次请求我网站上的任何页面时,加载整个项目对我来说似乎效率低下。实际上,这不是什么大问题,因为我使用的是 NHibernate,它只会延迟加载项目中请求的项目。然而,让网站的效率如此依赖于使用延迟加载的 ORM 似乎是糟糕的设计。
这是一个更新,希望能让我的问题更清楚。
首先,我试图了解我的项目类型是否应该是我的模型的聚合根。项目可以单独存在,而报告必须存在于项目中。如果删除项目,则应删除相应的报告。这是否意味着 Project 可以或应该是聚合根?这个我不是很清楚。
如果 Project 是聚合根,那么 Report 应该不正确?据我了解,根不应嵌套在 DDD 中。此外,只允许从存储库中检索聚合根。因此,如果 Report 不是聚合根目录,那么我不应该有 ReportsRepository,而应该只通过从 ProjectsRepository 检索到的项目访问报告。因此,即使页面只需要来自单个报表的数据,它也需要从 ProjectRepository 加载整个项目才能获取报表。
此外,如果 Project 是包含 Reports 的聚合根,则也可以设置从 ProjectRepository 中删除 Project 以删除它包含的 Reports。但是,如果 Project 和 Report 都是聚合根,那么在删除 Project 时不允许 ProjectRepository 删除 Reports 会打破聚合之间的界限吗?聚合根及其相应的存储库不是应该相互独立吗?