当前位置: 首页 > 面试题库 >

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

闽承望
2023-03-14
问题内容

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

另一个编辑: 问题不是将域模型作为仅数据/
DTO,而是将Order具有OrderItems和一些calculateTotal逻辑的更丰富,更复杂的对象映射。特定的问题是,例如,当Order需要从中国的某个Web服务中获取OrderItem的最新批发价格时(例如)。因此,您正在运行一些Spring
Service,可以在中国调用该PriceQuery服务。订单具有calculateTotal,可迭代每个OrderItem,获取最新价格,并将其添加到总计中。

那么,您如何确保每个订单都具有对此PriceQuery服务的引用?在反序列化,从数据库加载以及新的实例化后如何恢复它?这是我的确切问题。

最简单的方法是将引用传递给calculateTotal方法,但是如果您的对象在其整个生命周期中都在内部使用此服务怎么办?如果有10种方法使用该怎么办?每次传递引用都很麻烦。

另一种方法是将calculateTotal移出Order,然后移入OrderService,但这会破坏OO设计,而我们将采用旧的“事务脚本”方法。

原始帖子:

简短版本: 富域对象需要引用许多组件,但是这些对象会被持久化或序列化,因此它们对外部组件(在这种情况下为Spring
Bean:服务,存储库等)的所有引用都是瞬态的,并且会被清除。从数据库反序列化或加载对象时,需要重新注入它们,但这非常丑陋,我看不到一种完美的方法。

较长的版本:
一段时间以来,我已经在Spring的帮助下练习了松散耦合和DI。它使我对事情保持可管理性和可测试性有很大帮助。但是,不久前,我阅读了域驱动设计和一些Martin
Fowler。结果,我一直试图将域模型从简单的DTO(通常是表行的简单表示,只是没有数据的逻辑)转换成更丰富的域模型。

随着我的领域的发展并承担新的职责,我的领域对象开始需要我在Spring上下文中拥有的一些bean(服务,存储库,组件)。这已迅速成为一场噩梦,并且是转换为富域设计的最困难部分之一。

基本上,有些地方需要手动将对应用程序上下文的引用注入到我的域中:

  • 从组件库或其他负责实体加载对象时,因为组件引用是瞬时的,并且显然不会持久化
  • 工厂创建对象时,因为新创建的对象缺少组件引用
  • 当对象在Quartz作业或其他地方反序列化时,由于擦除了瞬态组件引用,

首先,这很丑陋,因为我正在向对象传递一个应用程序上下文引用,并期望它通过名称引用将其提取到所需的组件。这不是注入,而是直接拉动。

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

第三,它容易出错,因为我必须记住在所有这些位置为所有这些对象注入内容,这比听起来要难。

必须有更好的方法,我希望您能对此有所了解。


问题答案:

我找到了答案,至少对于那些使用Spring的人来说:

6.8.1。使用AspectJ通过Spring依赖注入域对象



 类似资料:
  • 问题内容: 我想使用适当的依赖项注入来注入对象的字段。我尝试了很多不同的尝试注入等失败的组合。 问题答案: 解析是路由的属性,而不是控制器的属性。控制器将注入在路由级别上定义的依赖项,而无需在控制器上指定解析属性。 以您的一个示例(转换为JavaScript)为例,您将像往常一样定义控制器,即: 然后是路线上的resolve属性: 如果您想使用路由的resolve部分来减少代码,则需要使用数组样式

  • 我有一个相当大的遗留项目,我正在添加一个组件。此组件使用HtmlUnit。我可以用Maven编译它,但是当我运行它时,我得到: 所以它缺少正确的构造函数。我认为这几乎肯定是中的版本冲突,但我不确定如何解决它。下面是我的(请注意我一直尝试玩的排除和依赖关系管理的所有游戏): 有什么想法吗? 编辑:有人认为这个问题是这个问题的重复,但事实并非如此,因为本例中的依赖类型不是。

  • 在客户端服务器应用程序上工作,在服务器端,我有一个面向客户端的服务组件,它拦截来自客户端的所有套接字请求,扫描消息后,它通过消息总线路由到不同的服务,因此它们是松散耦合的。 类似这样: 问题是,一旦服务完成了业务逻辑,就需要将回复发送回客户端,但通过“请求处理程序服务”,因此来自所有服务的所有回复消息都通过单个服务组件,即“请求处理程序服务”,因为我没有ChannelHandleContext对象

  • 假设我们有一个带有s的表示一行注释。这些笔记存储在某个地方(本地数据库、网络等),每次调用时,都会根据存储的数据绘制正确数量的s。 现在,假设用户想要删除注释,解析特定 返回到其存储实体的最佳方式是什么? 目前,我知道的唯一方法是使用< code >视图。标签,并有一些管理器将它转换成数据实体,但它看起来相当混乱。 还有其他选择吗?

  • 我正在开发一个Android库。该库几乎没有依赖关系。我不确定如果开发人员将我的库与我的库中已经存在的其他依赖项一起使用会发生什么。我试着搜索这个,但什么也找不到。 例如,我在我的库中使用version X的Volley库,并将其作为gradle包发送。开发人员将Version Y和我的库一起导入Volley。 在库(模块、jar或包)中包含依赖项的最佳方式是什么,以最大限度地减少冲突情况。