2016-09-29 102 views
2

在我的一些項目的雙重分派,我用的是雙調度機制在運行時提供了我的基礎設施模塊的「查看」我的域名模塊(Strengthening your domain: The double dispatch pattern)。我上面稱之爲「模塊」的只是單獨的jar文件,其中來自service.jar-> domain.jar的依賴僅在編譯時被強制執行。如果我將我的服務和域定義爲「真正的」java 9模塊,我能否在java-9上運行此工作?的Java 9模塊和DDD

module domain 
    L Fee.java 
     L Payment recordPayment(double, BalanceCalculator) 
    L BalanceCalculator.java 
module service 
    L BalanceCalculatorImpl.java // implements BalanceCalculator 
     L double calculate(Fee fee) //call fee.recordPayment(amount,this) 

回答

3

是的,這是可能的。這裏有一些事情要考慮:

  1. 模塊需要export the packageFee。可能給每個人,但至少有to service
  2. 模塊服務將不得不require domainBalanceCalculatorImplaccessBalanceCalculator,因爲它實現它。
  3. 它看起來像服務的客戶需要知道的關於以及這是implied readability的教科書案例。
  4. 在一個簡單的設置無論是服務或一些第三方模塊必須初始化BalanceCalculatorImpl並將它傳遞給Fee,這不能發生,或者它會創建一個循環依賴。
  5. 更高級的解決方案是services,其中所有可以訪問BalanceCalculator的代碼,即使在中也可以獲得其所有實現。

把所有的這些考慮進去,這是兩個module declarations可能是什麼樣子:

module com.example.domain { 
    // likely some requires clauses 

    // export packages containing Fee and BalanceCalculator 
    exports com.example.domain.fee; 
    exports com.example.domain.balance; 
} 

module com.example.service { 
    requires public com.example.domain; 
    // likely some more requires clauses 

    // expose BalanceCalculatorImpl as a service, 
    // which makes it unnecessary to export the containing package 
    provides com.example.domain.balance.BalanceCalculator 
     with com.example.service.balance.BalanceCalculatorImpl; 
} 

然後每一個喜歡用BalanceCalculator可以uses com.example.domain.balance.BalanceCalculator宣佈在其模塊聲明,並得到實例模塊那使用Java's ServiceLoader

可以在a demo I created找到該模塊系統(特別是服務的更多實際應用

(注:答案this exchange後修訂)

+0

任何措施或方法來定義一種。運行'weak'依賴? – Franck

+0

其實你的樹是錯誤的。在域,我有一個接口,我們稱之爲BalanceCalculator和我的服務,我有它的IMPL,稱之爲BalanceCalatorImpl.java .....我是阻止在?情況 – Franck

+1

您可以更新您的問題,包括信息 - 最好在圖:) – Nicolai