java - DDD - java 9 模块项目组织
问题描述
我正在尝试使用 java 9 中的六边形架构(使用 maven 模块)来组织 DDD 项目。是否有任何工作示例已经在生产系统中使用?所以,到目前为止,我只知道如何做到这一点:
在这里,我的domain
模块包含所有命令、事件、域模型(带有聚合、实体和值对象)以及存储库接口 + 域服务接口(如果在基础设施上中继)和实现。其他application
模块包含应用程序服务,其中我有应用程序的“用例”(协调加载聚合等的简单方法)。
那么这些十六进制架构的适配器呢?每个适配器是否应该在模块中分开(例如mysql-adapter
,我可以在哪里实现依赖于基础设施的存储库?另外,为rabbitmq聚合有单独的模块?
任何关于这方面的例子都会很棒!
解决方案
我正在用 java 9 和 maven 编写一个六边形架构示例。还没写完,等我写完再发。
但到目前为止,我可以告诉你我的方法:
一个六边形模块(不需要其他模块)。对于每个端口,我都有一个模块导出的包。
每个适配器一个模块。需要六边形模块。
一个主模块。需要六边形和所有适配器模块。没有其他模块需要主模块。它构建整个系统并运行驱动程序适配器。
为了为每个驱动端口选择一个适配器,我使用 serviceloader 机制。
在这个例子中我没有使用 DDD,但如果我使用它,结构将是:
六边形将是一个聚合器模块(无源代码),只有 2 个需要传递到应用程序模块和域模块。
应用程序模块需要域模块。它导出作为驱动程序端口(用例)的包,也可能是驱动端口(由驱动适配器实现)。
域不需要模块。它导出作为驱动端口的包。
我推荐 Sander Mark 和 Paul Bakker 的《Java 9 Modularity》一书。
我将发表一篇文章在
https://softwarecampament.wordpress.com/portsadapters/
如果你想在完成后看看我在 github 上的例子。
推荐阅读
- java - 在图书馆找不到 jar
- c++ - 如果有的话,有没有办法获得 QColor 的智能名称?
- c# - KeyDown 事件不让计时器启动
- wpf - 用于 WPF 渲染压缩控件的 CefSharp
- swift - 如何使用 POST 方法快速在标头字段中传递令牌
- javascript - 查找数组中重复字符的唯一索引
- c# - Visual Studio-Resharper-Stylecop:如何摆脱属性值的缩进?
- python - 如何找出单击了哪个输入类型的提交按钮?或者如何获取单击按钮的值或名称?
- ios - MXSegmentedPager 与 TableView 重叠
- java - Bean 属性 'xxx' 不可读或有无效的 getter 方法:getter 的返回类型是否与 setter 的参数类型匹配?