Domain driven design Can';我们不得不将域实体视为浪费。为什么?

Domain driven design Can';我们不得不将域实体视为浪费。为什么?,domain-driven-design,repository-pattern,Domain Driven Design,Repository Pattern,当我读到DDD、模式和应用程序体系结构的许多其他主题时,我脑海中有一个问题已经激荡了几个月。我将用一个MVC web应用程序来构建这个框架,但我确信,问题要广泛得多。这就是:对域实体的坚持是否会在应用程序中造成僵化和低效 DDD方法对于管理应用程序的业务逻辑以及作为与涉众合作的一种方式是完全有意义的。但对我来说,它在多层应用程序的上下文中会分崩离析。也就是说,当一个视图需要一个实体的所有数据或者甚至两个存储库都拥有这些数据时,很少有场景。就其本身而言,这并不坏,但这意味着我会进行多个查询,返回一

当我读到DDD、模式和应用程序体系结构的许多其他主题时,我脑海中有一个问题已经激荡了几个月。我将用一个MVC web应用程序来构建这个框架,但我确信,问题要广泛得多。这就是:对域实体的坚持是否会在应用程序中造成僵化和低效

DDD方法对于管理应用程序的业务逻辑以及作为与涉众合作的一种方式是完全有意义的。但对我来说,它在多层应用程序的上下文中会分崩离析。也就是说,当一个视图需要一个实体的所有数据或者甚至两个存储库都拥有这些数据时,很少有场景。就其本身而言,这并不坏,但这意味着我会进行多个查询,返回一组属性,而我不需要得到一些我需要的属性。一旦完成,无关的信息要么传递到视图,要么就有丢弃、合并数据并将数据映射到DTO或视图模型的开销。我需要生成很多报告,而问题似乎在那里被放大了。每一个都需要一个独特的信息切片或聚合,SQL可以很好地完成,但存储库不能,因为它们需要返回完整的实体。老实说,这似乎是浪费,我不想在原则上敲打一个数据库并产生不必要的网络流量。从这样的问题来看,似乎我不是唯一一个在这个问题上挣扎的人。那么,对于它似乎施加的限制,答案是什么呢


感谢一位新的、令人困惑的DDD er。

如果您认为完全成熟的DDD对于您的场景来说太难了,那么您可能需要退一步,看看更接近活动记录的内容

我使用DDD,但在我的场景中,我必须支持多个前端;两个网站和一个WinForms应用程序,以及一组允许与其他自动化流程交互的服务。在这种情况下,额外的复杂性是值得的。我使用DTO将数据的表示形式传输到各个表示层。将域实体映射到DTO的CPU开销很小——与网络调用和数据库调用相比,这是一个舍入错误。在管理这种复杂性时也存在开销。通过使用,我在一定程度上缓解了这种情况。我的存储库返回完全填充的域对象。我的服务层将映射到/来自DTO。在这里,我们可以展平域对象,组合域对象等,以生成数据的更表格化表示

迪诺·埃斯波西托(Dino Esposito)在MSDN杂志上写了一篇关于这个主题的文章——你可能会发现这很有趣


所以,我想回答你的“为什么”问题——和往常一样,这取决于你的背景。DDD可能太费劲了。在这种情况下,做一些简单的事情。

这里真正的问题是什么?处理业务规则和查询数据是两个截然不同的问题。这一实现将我们引向CQRS-命令查询责任分离。那是什么?您只是不能对这两个任务使用相同的模型:域模型是关于行为、执行业务流程和处理命令的。还有一个单独的报告模型用于显示。通常,每个视图可以包含一个表。这些表只包含相关信息,因此您可以删除DTO、AutoMapper等

这两个模型如何同步?这可以通过多种方式实现:

  • 报告模型可以构建在数据库视图之上
  • 数据库复制
  • 域模型可以发布包含每个更改信息的事件,并且可以通过非规范化程序更新报告模型中的适当表来处理这些事件
正如我读到的DDD、模式和应用程序体系结构的许多其他主题一样

领域驱动设计不是关于模式和体系结构,而是关于根据业务领域设计代码。不要考虑存储库和层,而是考虑您试图解决的问题。“开始康复”最简单的方法是将
ProductRepository
重命名为
Products

遵守域实体是否会在应用程序中造成僵化和低效

效率低下源于糟糕的建模。[需要引用]

DDD方法对于管理应用程序的业务逻辑以及作为与涉众合作的一种方式是完全有意义的。但对我来说,它在多层应用程序的上下文中会分崩离析

也就是说,当一个视图需要一个实体的所有数据或者甚至两个存储库都拥有这些数据时,很少有场景。就其本身而言,这并不坏,但这意味着我会进行多个查询,返回一组属性,而我不需要得到一些我需要的属性

根据需要查询该数据。不要试图把你的问题包装成一些“现成的解决方案”。取而代之的是——从中学习,只应用解决问题所必需的东西

每一个都需要一个独特的信息切片或聚合,SQL可以很好地完成,但存储库不能,因为它们需要返回完整的实体

那么,对于它似乎施加的限制,答案是什么呢

“似乎”


顺便说一句,互联网上充斥着这样的东西(我指的是示例应用)。
要理解DDD是什么,请慢慢仔细阅读。两次

每一个都需要一个独特的信息切片或聚合,SQL可以很好地完成,但存储库不能,因为它们需要返回完整的实体

向存储库中添加方法以仅返回所需内容,例如iordrepository.GetByCustomer DDD完全可以。
您还可以使用或使您的存储库更通用;只记得不要在存储库的接口中使用任何特定于ORM的东西(例如NHibernate的ICriteria)

我认为这是一个很好的问题,但我认为你自己解决了这个问题——报告与行为。我担心prolife的维护负担