【问题标题】:Spring jpa entity and dynamic dispatchingSpring jpa 实体和动态调度
【发布时间】:2016-08-28 03:01:33
【问题描述】:

我有实体动物。它有两个孩子:狗和猫。 Animal 可以 makeVoice(),但 Cats 和 Dogs 的做法不同。

现在有一个问题,使用 Hibernate,我将检索 Dog 的实例,在方法 makeVoice() 中为 Dog 调用 HumanService,但它是 Spring bean,单例。我应该如何围绕这个设计?注入/自动装配 HumanService 似乎污染了 Cat/Dog,但这必须动态解决。我想不出办法在外面设计这个决议。有没有这样的方法?

【问题讨论】:

  • 如果Dog 需要HumanService,我不认为注入它会“污染”Dog。你正在注入它的依赖!

标签: java spring jpa strategy-pattern


【解决方案1】:

如果您的动物调用服务,您的设计似乎是领域驱动的,但并不完全。 如果您有 DDD,由于 Service 后缀,我不会将其称为 HumanService。我想而不是狗直接与人类交流。

我认为您应该尝试通过服务层或域对象之间的通信进行推理,而不是它们的混合。当然,在 DDD 中,您可以拥有服务,但在相关时,不能用于域的两个对象之间的通信。

关于混合 spring bean 和 JPA 实体,看起来确实有点尴尬,不是逻辑上,而是你使用两个不同的库在同一个类上编织行为这一事实。
JPA 不使用 Spring实例化实体,所以你应该使用技巧来做这两个。 如果您可以避免在实体中使用 Spring 而不会增加大量开销来添加逻辑,我认为您的设计可能会更简洁。否则,请使用技巧。

如果混合使用这两种方法让您感到厌烦,请不要使用 DDD,而是使用服务设计:DogService 使用以狗为参数的方法与 HumanService 进行通信

【讨论】:

  • 接受,因为得出了相同的结论。其他答案试图提供技巧来做到这一点,而不是专注于设计中的问题。嘘
  • @Sarief 完全正确。使用可读和标准的设计是开发中最重要的事情之一。只有在别无选择的情况下,您才应该接受失去可读性和标准。
  • 好吧,我不完全确定发生了什么,但现在我在这里学到了一点,是解释:我的核心模块使用服务层进行业务逻辑,而我尝试实现的模块使用域来实现业务逻辑。我刚开始时缺乏知识,但现在我知道了,我可以说。答案真是精彩解说,唉,原来是我不懂。
猜你喜欢
  • 2016-06-29
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2021-11-19
  • 2017-05-06
  • 2015-09-11
相关资源
最近更新 更多