当前位置:  开发笔记 > 编程语言 > 正文

如何解决松散耦合/依赖注入与富域模型之间的冲突?

如何解决《如何解决松散耦合/依赖注入与富域模型之间的冲突?》经验,为你挑选了0个好方法。

编辑:这不是理论层面的冲突,而是实施层面的冲突.

另一个编辑: 问题是没有域模型作为仅数据/ DTO与更丰富,更复杂的对象映射,其中Order具有OrderItems和一些calculateTotal逻辑.具体问题是,例如,Order需要从中国的某些Web服务中获取OrderItem的最新批发价格(例如).所以你运行了一些Spring Service,允许在中国调用这个PriceQuery服务.Order具有calculateTotal,它遍历每个OrderItem,获取最新价格,并将其添加到总数中.

那么您如何确保每个订单都引用此PriceQuery服务?如何在反序列化,从DB加载和新实例化时恢复它?这是我的确切问题.

简单的方法是传递对calculateTotal方法的引用,但是如果您的Object在其生命周期内部使用此服务该怎么办?如果它在10种方法中使用怎么办?每次传递引用都很麻烦.

另一种方法是将calculateTotal移出Order并进入OrderService,但这会打破OO设计,我们将转向旧的"事务脚本"方式.

原帖:

简短版本: 富域对象需要引用许多组件,但这些对象会被持久化或序列化,因此它们对外部组件(在本例中为Spring bean:服务,存储库,任何东西)所持有的任何引用都是暂时的并且会被消除.当对象被反序列化或从DB加载时,需要重新注入它们,但这非常难看,我看不到一种优雅的方法.

更长的版本: 有一段时间了,我已经在Spring的帮助下练习了松耦合和DI.这对我保持可管理性和可测试性有很大帮助.不久前,我读了Domain-Driven Design和一些Martin Fowler.因此,我一直在尝试将我的域模型从简单的DTO(通常是表行的简单表示,只是数据无逻辑)转换为更丰富的域模型.

随着我的域增长并承担新的职责,我的域对象开始需要我在Spring上下文中使用的一些bean(服务,存储库,组件).这很快成为一场噩梦,也是转换为丰富域设计最困难的部分之一.

基本上我有一些点,我手动将应用程序上下文的引用注入我的域:

当从Repository或其他负责实体加载对象时,因为组件引用是暂时的,显然不会被持久化

从Factory创建对象时,因为新创建的对象缺少组件引用

当对象在Quartz作业或其他某个地方被反序列化时,因为瞬态组件引用被擦除

首先,它很难看,因为我将对象传递给应用程序上下文引用,并希望它通过名称引用它所需的组件.这不是注射,而是直接拉动.

其次,它是丑陋的代码,因为在所有提到的地方我需要逻辑来注入appContext

第三,它容易出错,因为我必须记住为所有这些对象注入所有这些对象,这比听起来更难.

必须有一个更好的方法,我希望你能够对它有所了解.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有