domain-driven-design - Java 9 模块和 DDD 中的双重调度

标签 domain-driven-design java-9 java-platform-module-system java-module

在我的一些项目中,我使用双重调度机制在运行时向我的域模块 ( Strengthening your domain: The double dispatch pattern ) 提供基础结构模块的“ View ”。我上面所说的“模块”只是单独的 jar 文件,其中 service.jar->domain.jar 的依赖关系仅在编译时强制执行。如果我将我的服务和域定义为“真正的”java 9 模块,我可以在 java-9 上使用此功能吗?

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)

最佳答案

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

  1. 模块需要export the package包含费用。可能对每个人都有效,但至少对 to service 有效。
  2. 模块service将必须为require domain,因为BalanceCalculatorImpl必须为access BalanceCalculator,因为它实现了它。
  3. 看起来服务的客户端也需要了解,这是 implied readability 的教科书案例。
  4. 在简单的设置中,service 或某些第三个模块必须实例化 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 之后修改。)

关于domain-driven-design - Java 9 模块和 DDD 中的双重调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39771709/

相关文章:

c# - 人是聚合根吗?

java - 获取 JavaFX 场景图上的所有阶段

java - 在 Java 9 中,为什么包冲突在某些情况下会有所不同?

java - 在 Java 15 模块化设置中的 Eclipse 中使用 SWT

architecture - 如何在 DDD 中设计多阶段任务

python - 领域驱动设计(DDD): A Domain or Infrastructure Concern

java - 如何解决松散耦合/依赖性注入(inject)与富域模型之间的冲突?

java-9 - 为什么 javac 提示命名自动模块?

java - Spring:@Resource 注入(inject)在 JDK9 下停止工作

java - Spring Boot 在模块化 Java 中配置 DevTools