问一个关于Service层的同层依赖问题

按照DDD的思想,我对我的项目也设计了Service层,但对Service层还没有详细的划分,可能我的应用还没有达到很复杂的程度,等有时间banq大哥给讲讲如何对Service再分层。

这里遇到一个问题,就是我在一个Service A里写的一些业务处理代码,在另一个Service B里也想使用这段代码,如果直接copy的话就违反了代码复用原则,但是如果让B直接调用A的方法觉得比较怪,因为我是用Spring把Service直接注入Action中的,A和B之间没有直接的引用。

请问banq大哥,遇到这种情况你是如何解决的?

首先,你得确定一件事情,就是Service A确实需要调用Service B还是Service A需要使用到Service B中的一段代码。

如果是前者,那就是Service A调用Service B,毫无疑问。

如果是后者,你应该考虑将Service B的那段代码单独拿出来(放在哪里你自己考虑,当然不能放在Service B中),Service A和Service B都调用这段代码。

是需要调用整个方法,不是一段代码。
我是用Spring来管理对象,Service对象被注入到Action中,如果在Service中注入Service,总是觉得不伦不类的

>我是用Spring来管理对象,Service对象被注入到Action中,如果在Service中注入Service,总是觉得不伦不类的

假如Spring的官方文档中提供了这种用法,你还会这么觉得吗?

事实上,你在设计Service的时候,就必须考虑Service之间是否允许相互调用,如果允许的话,采用何种方式进行调用,其约束条件是什么?

先别去考虑形式,到底是“注入”还是直接调用。如果你发现这两个服务确实是紧耦合的,就直接调用,如果你发现两者不是紧耦合的,就用注入。

是不是应该在Service下再加入一层更好呢?
我知道把不同的行为分别封装到不同的Service中,但是有时候还是有一些重复的代码,不想在多个Service中copy,请问大家是不是都遇到过这样的问题,大家都是怎么样解决的?

>就是我在一个Service A里写的一些业务处理代码,在另一个Service B里也想使>>用这段代码,如果直接copy的话就违反了代码复用原则

将这段代码重构成一个新的类,service A和B共同调用

可以在Service下再加入一层