在我的一些项目中,我使用双重调度机制在运行时向我的域模块 ( 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)
最佳答案
是的,这是可能的。以下是一些需要考虑的事项:
- 模块域需要export the package包含
费用
。可能对每个人都有效,但至少对 to service 有效。 - 模块service将必须为require domain,因为
BalanceCalculatorImpl
必须为accessBalanceCalculator
,因为它实现了它。 - 看起来服务的客户端也需要了解域,这是 implied readability 的教科书案例。
- 在简单的设置中,service 或某些第三个模块必须实例化
BalanceCalculatorImpl
并将其传递给Fee
,这不会发生在域否则会产生循环依赖。 - 更高级的解决方案是 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/