我的应用程序中有3个服务类,每个服务类都是针对具体功能而编写的,具有相应的DAO接口和他们的实施课程。 所有服务都有不同的包。
说我有
AService.java & ADAO.java
ADAO接口被注入AService.java类。同样我有
BService.java & BDAO.java
CService.java & CDAO.java
现在我想介绍一些BDAO& amp;的方法。 ASERvice.java中的CDAO实现类
最好的方法是什么?
我注射了BDAO& ASAOvice.java中的CDAO。那会是一个好习惯吗?在这种情况下,服务紧密耦合。
我在各自的DAO中编写冗余代码。
我创建了一个通用的DAO&尝试从所有单独的DAO中提取所有常用方法。投入其中。这是一项艰巨的任务。此外,我不确定将来在哪种特定服务中需要DAO的方法。
答案 0 :(得分:5)
在这种情况下,我会选择第一个选项。服务可以比DAO具有更高的抽象级别。
我肯定不会采用第二种方法,如果公共代码是某些实用程序代码,第三种选项可能有效,如果公共代码来自不同的实体/逻辑,我不会这样做域。
答案 1 :(得分:4)
如果您在DAO层中共享行为,则应该使用DAO层内的继承或组合(关联)来执行此操作。
您按照“A”,“B”,“C”这样的域名对您的应用进行了切片,因此AService
应该不通过BService
访问任何类型在B域中实现B的逻辑。
请参阅@oliver-gierke talk "Whoops! Where did my architecture go?"。由于这个简单的绕过,他建议组织像这样的包
public class com.product.a.AService
/*package*/ class com.product.a.ADao
public class com.product.b.BService
/*package*/ class com.product.b.BDao
public class com.product.c.CService
/*package*/ class com.product.c.CDao
通过此操作,您强制执行其他“域”没有使用域的Daos。否则,您可能违反了您的架构规则。
共享不同域的DAO的问题在于,您可以绕过在其他域服务层中实现的businesslogic。
例如,对于B
上的每个“删除”操作,都应将电子邮件发送给客户。如果AService
直接使用BRepository
,它会授予删除B实例的权限,并绕过发送电子邮件的逻辑。