我有点困惑在哪里实现应用程序的查询端,atm我有下一个架构:
Product.UI.Web.Admin (MVC)
Product.Application
-CommandHandlers (e.g OrdersCommandHandler)
-Commands (e.g CreateOrder)
Product.Domain
-Model (Behavior-rich models / repository interfaces)
Product.Infrastructure (Base interfaces / classes)
Product.Persistence
-ReadModel (EF Generated models)
--Implementation (Repository implementations: FindByID / Save)
所有三个解决方案都将DTO返回给UI。
我正在考虑解决方案#3,因为在查询中使用域服务来构建结果很容易,而且它还会使用Product.Reporting作为数据访问可以使用ADO.Net,Entity Framework或NHibernate实现。或许我误解了一些事情。
请指导我并帮我清理一下,谢谢。
更新 我来到第四个变种。
答案 0 :(得分:1)
我认为我只是在这里应用依赖性倒置原则,并且具有定义接口的Application.Queries
和实现这些接口的Infrastructure.Queries
。但是,我也看到基础设施问题直接涉及Application
层。例如,这就是Vaughn Vernon在SaasOvation合作BC的com.saasovation.collaboration.application.calendarCalendarEntryQueryService中所做的。
答案 1 :(得分:0)
是的,我也认为你误解了一些事情。我正在考虑解决方案#3,因为在查询中使用域服务很容易构建结果,并且它将使用Product.Reporting作为数据访问,可以使用ADO.Net,Entity Framework或NHibernate实现。或许我误解了一些事情。
首先让我们谈谈域名服务是什么?: 当你有一个域概念涉及多个实体,但你是 不确定哪个实体“拥有”该行为。它似乎并不属于任何一种。这种思维模式是强烈的 域服务需求指标。 因此,当您使用cqrs时,域服务存在于命令端,因此查询端无法访问域服务,实际上并且自然地它不需要域服务,因为查询端不执行任何操作业务逻辑。你应该记住Command端和Query端是完全独立的。
CQRS的另一个重要特征是,ReadModel可以使用ADO.Net或微ORM等低级数据访问技术,并通过士气低落的表格查询生成报告。所有这些想法都是出于性能考虑。随着系统的发展,将来你甚至可以在两个独立的实例上启动Command和Query。