首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解决松散耦合/依赖注入与富域模型之间的冲突?

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

Stack Overflow用户
提问于 2009-03-29 09:23:51
回答 6查看 2.7K关注 0票数 17

编辑:这不是理论层面的冲突,而是实现层面上的冲突。

另一个编辑:问题是没有域模型作为仅数据的/DTOs,而不是更丰富、更复杂的对象映射,其中Order具有OrderItems和一些calculateTotal逻辑。具体的问题是,例如,当订单需要从中国的一些网络服务中获取OrderItem的最新批发价时(例如)。因此,您可以运行一些Service,允许在中国中调用此PriceQuery服务。Order有calculateTotal,它遍历每个OrderItem,获取最新价格,并将其添加到总数中。

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

简单的方法是传递对calculateTotal方法的引用,但是如果对象在其生命周期内在内部使用该服务,怎么办?如果在10种方法中使用呢?每次传递引用都会变得很麻烦。

另一种方法是将calculateTotal从顺序移到OrderService中,但这违背了OO设计,我们转向了旧的“事务脚本”方式。

原始员额:

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

更长的版本:已经有一段时间了,我在Spring的帮助下练习了松耦合和DI。它帮助我保持了一些可管理和可测试的功能。然而,不久前,我读过领域驱动的设计和一些马丁·福勒。因此,我一直试图将我的域模型从简单的DTO(通常是表行的简单表示,只是数据没有逻辑)转换为更丰富的域模型。

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

基本上,在某些点上,我手动地将对应用程序上下文的引用注入到我的域中:

  • 当对象从存储库或其他负责实体加载时,因为组件引用是短暂的,显然不会持久
  • 当对象是从工厂创建的,因为新创建的对象缺少组件引用
  • 对象在Quartz作业或其他地方被反序列化时,因为瞬态组件引用被删除。

首先,它很难看,因为我将对象作为应用程序上下文引用传递,并期望它通过名称引用来提取它需要的组件。这不是注射,而是直接拉动。

第二,这是丑陋的代码,因为在所有提到的地方,我需要逻辑注入一个appContext

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

一定有更好的方法,我希望你能对此有所了解。

EN

Stack Overflow用户

发布于 2009-03-29 10:58:26

身份图模式可能会对您的场景有所帮助。查看由杰里米·米勒( Jeremy )撰写的文章实践中的模式,他在文章中讨论了这种模式。

票数 0
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/694374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档