我有实体动物。它有两个 child :狗和猫。动物可以 makeVoice(),但猫和狗的做法不同。
现在有一个问题,使用 Hibernate 我会检索 Dog 的实例,在 Dog 的 makeVoice() 方法中我会调用 HumanService,但它是 Spring bean,单例。我应该如何围绕这个进行设计?注入(inject)/ Autowiring HumanService 看起来像是污染猫/狗,但这必须动态解决。我想不出一种方法可以在外面设计这个分辨率。有这样的办法吗?
最佳答案
如果您的动物调用服务,您的设计似乎是领域驱动的,但并不完全。
如果你有 DDD,我不会将其称为 HumanService,因为有 Service 后缀。我想象狗不会直接与人交流。
我认为您应该尝试通过服务层或域对象之间的通信进行推理,而不是它们的混合。当然,在 DDD 中,您可以拥有服务,但当它相关时,不能用于域的两个对象之间的通信。
关于混合 spring beans 和 JPA 实体,看起来确实有点尴尬,不是在逻辑上,而是在你使用两个不同的库在同一个类上编织行为的事实。
JPA 不使用Spring 实例化实体,因此您应该使用技巧来完成这两件事。
如果您可以避免在实体中使用 Spring,而不需要增加大量开销来添加逻辑,我认为您的设计可能会更干净。否则,请使用技巧。
如果混合两者让您烦恼,请不要使用 DDD,而是使用服务设计:DogService
使用以狗作为参数的方法与 HumanService
进行通信
关于java - Spring jpa实体和动态调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168684/