首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 9模块与DDD中的双调度

Java 9模块与DDD中的双调度
EN

Stack Overflow用户
提问于 2016-09-29 13:29:32
回答 1查看 512关注 0票数 2

在我的一些项目中,我使用双分派机制在运行时向域模块(强化您的域:双重调度模式)提供我的基础设施模块的“视图”。上面我所称的“模块”只是单独的jar文件,其中来自service.jar->domain.jar的依赖仅在编译时强制执行。如果我将我的服务和域定义为“真正的”java 9模块,我能让它在java-9上工作吗?

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-30 06:37:36

是的,那是可能的。以下是一些需要考虑的事项:

  1. 模块域需要包含出口包装Fee。可能是每个人,但至少是
  2. 模块服务必须是要求,因为BalanceCalculatorImpl必须实现访问 BalanceCalculator,因为它实现了它。
  3. 看起来,服务客户也需要了解域,这是隐含可读性的一个教科书案例。
  4. 在一个简单的设置中,无论是服务还是第三个模块,都必须实例化BalanceCalculatorImpl并将其传递给Fee,这在域中是不可能发生的,否则就会创建循环依赖关系。
  5. 更高级的解决方案是服务,在这里,所有可以访问BalanceCalculator的代码,即使是在域中,都可以获得它的所有实现。

考虑到所有这些因素,这两个模块声明可能是这样的:

代码语言:javascript
复制
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在其模块声明中声明它,并使用ServiceLoader获取该模块的实例。

您可以在我创建了一个演示中找到更实用的模块系统应用程序(特别是服务)。

(注:答案是在这次交换之后修改的。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39771709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档