使用一个DAO的方法到另一个

时间:2016-07-07 06:25:37

标签: java spring hibernate design-patterns architecture

我的应用程序中有3个服务类,每个服务类都是针对具体功能而编写的,具有相应的DAO接口和他们的实施课程。 所有服务都有不同的包。

说我有

AService.java & ADAO.java ADAO接口被注入AService.java类。同样我有

BService.java & BDAO.java

CService.java & CDAO.java

现在我想介绍一些BDAO& amp;的方法。 ASERvice.java中的CDAO实现类

最好的方法是什么?

  1. 我注射了BDAO& ASAOvice.java中的CDAO。那会是一个好习惯吗?在这种情况下,服务紧密耦合。

  2. 我在各自的DAO中编写冗余代码。

  3. 我创建了一个通用的DAO&尝试从所有单独的DAO中提取所有常用方法。投入其中。这是一项艰巨的任务。此外,我不确定将来在哪种特定服务中需要DAO的方法。

2 个答案:

答案 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实例的权限,并绕过发送电子邮件的逻辑。