2015-09-03 72 views
1

我理解在單個模塊內工作時的依賴倒置,但是我想在應用它時還有跨模塊依賴關係。在下面的圖中,我有一個現有的應用程序,我需要爲參考數據服務實現一些新的需求。我想我會創建一個新的jar(將來可能是一個獨立的服務)。第一幅圖顯示了我過去接觸過這種東西的正常方式。 referencedataservices jar中有一個應用程序用來調用它的接口。跨模塊使用依賴倒置原理的正確設計?

第二張圖顯示了我嘗試使用DIP,該應用程序現在擁有其抽象,因此它不會因參考數據服務更改而改變。這似乎是一個錯誤的設計,因爲它創建了一個循環依賴。 MyApp依賴於referencedataservices jar,而referencedataservices jar依賴於MyApp。

所以第三個圖通過創建一個額外的抽象層回到更正常的依賴關係。我對嗎?或者這真的不是DIP的意圖?有興趣聽取其他方法或建議。

dependency inversion diagrams

回答

1

第二個例子是通過將實現從其抽象分離出來的正確軌道。爲了實現模塊化,具體類不應該與抽象接口位於同一個包(模塊)中。

第二個例子中的錯誤是客戶擁有抽象,而服務擁有實現。這兩個角色必須顛倒過來:服務擁有接口;客戶自己的實現。通過這種方式,該服務提供了一個合同(API)供客戶實施。該服務保證與遵守其API的任何客戶端進行交互。就依賴性倒置而言,客戶端將依賴注入到服務中。

Kirk K.是Java中的模塊化權威。他有一個博客,最終變成了關於這個主題的book。他的博客目前似乎不存在,但我可以在Wayback Machine中找到它。我想你會對標題爲Applied Modularity的四部分系列特別感興趣。關於DIP的其他方法或替代方法,請參閱Fun With Modules,其中涵蓋其中三個。

0

在你提出,如果移動RefDataSvc抽象單獨包你打破這個循環和referencedataservices套餐使用僅包RefDataSvc抽象第二種方法。

Composition Root in MyApp包之外的其他代碼也應取決於RefDataSvc。在您的應用程序的Composition Root中,您應該編寫應用程序中所需的所有依賴項。