假设我有2个服务类:
UserService
ProductService
如果在我的ProductService类中注入UserService,那是不是错误?
public class ProductserviceImpl implements ProductService {
@Autowired
UserService userService;
@Override
public void someThing() {
..
userService.otherThing(..);
..
}
}
我知道作为替代我可以创建另一个注入UserService和ProductService的类,但是为这个类提供一个名称非常棘手:)这些类型的名称是否有名称? SOA世界中的类?
答案 0 :(得分:2)
1)如果在我的ProductService类中注入UserService,那是不是错误?
这本身没有任何问题,但有以下警告:
2)这类类型是否有名称(注入UserService和ProductService)?
是的,如前所述,您可以将此类称为Mediator,因为Mediator Pattern似乎描述了这一点。
您可以同时拥有低级服务和高级服务,将低级服务(ProductService,UserService)注入高级服务(例如,PurchaseOrderService或PurchaseOrderMediator)。或者,对于此特定情况,您可能会将产品服务视为依赖于UserService的单个高级服务。此时,更多的是在业务逻辑和应用程序的上下文中哪个构造更多cohesive。
答案 1 :(得分:1)
对我来说,将服务注入另一个服务是没有问题的。正如您所说,这就是服务和SOA的关键所在。
服务可以互相帮助,以便为您提供最终结果。此外,正如JB Nizet所说,如果没有循环依赖,没问题。
答案 2 :(得分:0)
您所描述的内容称为Mediator Pattern。
什么是SOA?
答案 3 :(得分:0)
使用像您提到的弹簧将一个服务注入另一个服务将耦合,这两个服务仅在所使用的界面范围内。
如果您需要更多解耦,请考虑使用消息在两个服务之间传递。
可以像使用模式的值对象/ xml一样强类型化消息 或像HashMap一样弱类型
虽然弱类型消息可以增加解耦,但这意味着您和您的客户端将放弃编译时检查,并且在运行时调试问题将非常麻烦
答案 4 :(得分:0)
您所描述的是面向对象的集成,很可能不是SOA集成。你可能得到(并且应该避免)循环依赖的事实证明了这一点。
如果您的服务知道其他服务Java级接口,那么引入紧密耦合也是一个很大的风险。 例如,用户服务的返回类型是什么?它是另一个属于用户服务的接口吗?你是否在产品服务代码中传递了它?