2016-09-29 109 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