2016-07-07 24 views
2

我有3個服務類在我的應用程序與相應的DAO接口&其實現類特定功能的每一寫入。 所有服務有不同的包。使用一個DAO的方法進入另一個

說我有

AService.java & ADAO.java ADAO接口注入AService.java類。同樣地,我有

BService.java & BDAO.java 

CService.java & CDAO.java 

現在我想引用在AService.java

BDAO & CDAO實現類的一些方法應該是什麼做到這一點的最好方法是什麼?

  1. 我在AService.java注入BDAO & CDAO。這會是一個好習慣嗎?在這種情況下,服務緊密結合。

  2. 我寫在各自的DAO的冗餘代碼。

  3. 我創建了一個通用的DAO &嘗試從所有單個DAO &中提取所有常見方法。這是一項艱鉅的任務。今後我還不確定在哪種特定服務中需要哪種DAO方法。

+3

您應該做1.功能服務必須訪問來自各種實體的數據,因此使用多個DAO是完全正常的。 –

回答

5

我會在這種情況下通過第一個選項。服務可以比DAO具有更高的抽象級別。

我肯定不會用第二種方法去,如果通用代碼是一些實用的代碼第三個選項可能是有效的,我不會,如果通用代碼是由不同的實體/邏輯域做到這一點。

+0

我不同意建議第一個選項。從其他域注入DAO並繞過其業務邏輯層不是一個好主意。或者你會在控制器中做同樣的事情 - 我猜不是? – d0x

3

如果在DAO層共享行爲,你應該使用DAO層內部的繼承或成分(協會)做到這一點。

您可以通過如「A」,「B」,「C」域名切片您的應用程序,所以AService路過的BService沒有訪問任何類型B的邏輯在B域實現的。

@oliver-gierke談話"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實例並繞過發送電子郵件的邏輯。

+0

製作具有「常用功能」的「通用」DAO類,如果其他DAO需要,可以擴展它,這對我來說很可愛。謝謝。 – DarkPurpleShadow

相關問題