编辑:这不是理论层面的冲突,而是实施层面的冲突.
另一个编辑: 问题是没有域模型作为仅数据/ 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
第三,它容易出错,因为我必须记住为所有这些对象注入所有这些对象,这比听起来更难.
必须有一个更好的方法,我希望你能够对它有所了解.