![]() |
1
9
在设计我的模型时,我也遇到了类似的问题,我问了这个问题,我认为可能会对你有所帮助,特别是关于你的第一点。 DDD - How to implement high-performing repositories for searching . 在搜索方面,我不使用“模型”,而是使用返回“摘要”对象的专业搜索存储库…即“计划摘要”。这些仅仅是信息对象(可以认为更像是报告),并没有在事务性意义上使用-我甚至没有在我的模型类库中定义它们。通过创建这些专用存储库和类型,我可以实现高性能的搜索查询,这些查询可以包含分组数据(例如计划的训练计数),而无需在内存中加载聚合的所有关联。一旦用户在ui中选择了这些摘要对象之一,我就可以使用id来获取实际的模型对象并执行事务操作和提交更改。 因此,对于您的情况,我将为所有三个实体提供这些专门的搜索存储库,当用户希望对一个实体执行和操作时,您总是获取它所属的计划聚合。 这样,您就可以进行性能搜索,同时仍然使用所需的不变量维护单个聚合。 编辑-示例: 好的,所以我猜实现是主观的,但这是我在应用程序中处理它的方式,使用“teammember”聚合作为示例。用c写的例子。我有两个类库:
模型库包含聚合类,强制执行所有不变量,报表库包含以下简单类:
报表库还包含以下界面:
这是应用层(在我的例子中恰好是wcf服务)将使用的接口,它将通过我的ioc容器(unity)来解决实现问题。IReportRepository与Base ReportRepositoryBase一样,位于Infrastructure.Interface库中。所以我的系统中有两种不同类型的存储库-聚合存储库和报告存储库… 然后在另一个库repositories.sql中,我实现了:
那么,在我的应用程序层中:
然后在客户机中,用户可以选择其中一个对象,并对应用程序层中的一个对象执行操作,例如:
|
![]() |
2
4
这里真正的问题是srp违规。应用程序的输入部分与输出冲突。 坚持第一个解决方案(plan==聚合根)。人为地提升实体(甚至是值对象)来聚合根会扭曲整个域模型并破坏一切。 你可能想看看所谓的 CQRS (命令查询职责分离)完全适合解决此特定问题的体系结构。 Here's an example app 马克·尼霍夫。这里很好 'getting-started' 名单。 |
![]() |
3
3
|