编辑:这不是理论层面的冲突,而是实现层面上的冲突。
另一个编辑:问题是没有域模型作为仅数据的/DTOs,而不是更丰富、更复杂的对象映射,其中Order具有OrderItems和一些calculateTotal逻辑。具体的问题是,例如,当订单需要从中国的一些网络服务中获取OrderItem的最新批发价时(例如)。因此,您可以运行一些Service,允许在中国中调用此PriceQuery服务。Order有calculateTotal,它遍历每个OrderItem,获取最新价格,并将其添加到总数中。
那么,如何确保每个订单都有对此PriceQuery服务的引用?如何在反序列化、从DB加载和新的实例化时恢复它?这是我的问题。
简单的方法是传递对calculateTotal方法的引用,但是如果对象在其生命周期内在内部使用该服务,怎么办?如果在10种方法中使用呢?每次传递引用都会变得很麻烦。
另一种方法是将calculateTotal从顺序移到OrderService中,但这违背了OO设计,我们转向了旧的“事务脚本”方式。
原始员额:
短版本:富域对象需要对许多组件的引用,但这些对象会被持久化或序列化,因此它们对外部组件的任何引用(在本例中为Spring:服务、存储库等)都是短暂的,并且会被删除。当对象被反序列化或从DB加载时,需要重新注入它们,但是这是非常丑陋的,我看不出有一种优雅的方法。
更长的版本:已经有一段时间了,我在Spring的帮助下练习了松耦合和DI。它帮助我保持了一些可管理和可测试的功能。然而,不久前,我读过领域驱动的设计和一些马丁·福勒。因此,我一直试图将我的域模型从简单的DTO(通常是表行的简单表示,只是数据没有逻辑)转换为更丰富的域模型。
随着域的增长并承担新的责任,我的域对象开始需要Spring上下文中的bean(服务、存储库、组件)。这很快就变成了噩梦,也是转换为丰富域设计的最困难的部分之一。
基本上,在某些点上,我手动地将对应用程序上下文的引用注入到我的域中:
首先,它很难看,因为我将对象作为应用程序上下文引用传递,并期望它通过名称引用来提取它需要的组件。这不是注射,而是直接拉动。
第二,这是丑陋的代码,因为在所有提到的地方,我需要逻辑注入一个appContext
第三,它容易出错,因为我必须记住为所有这些对象注入所有这些地方,这比听起来更难。
一定有更好的方法,我希望你能对此有所了解。
发布于 2009-03-29 10:58:26
身份图模式可能会对您的场景有所帮助。查看由杰里米·米勒( Jeremy )撰写的文章实践中的模式,他在文章中讨论了这种模式。
https://stackoverflow.com/questions/694374
复制相似问题