DDD 域初始化事件/应用程序首次启动

DDD domain init event / application first startup

最近我在努力实现 DDD 应用程序的 'init' 逻辑。

我有一些服务应该使用特定值进行初始化,为了更加努力,假设我希望将来在应用程序首次启动时初始化一些聚合。

如果我正确理解 CQRS 中的 DDD 概念,我可以在每次应用程序启动时发出命令,并且在命令处理程序中,我将只检查不变性是否已经初始化,基本上当有一些持久存在时state registered,我会放弃这个命令,就像什么都没发生一样。

最大的问题是我不确定我应该把这种 startup/init 行为放在哪里,它似乎应该驻留在基础设施层中。

非常感谢:)

我想我个人会有一个专门用于此的命令 'first application start up'。 然后你会有一个命令处理组件,它的唯一目的是决定它是否是你的应用程序的第一次启动。

如果是,那么您发出后续命令以启动一些其他操作。 如果不是,您将完全忽略该命令,可能会记录初始化被拒绝的情况。 为了推动这个决定,你当然需要在某个地方有这个状态。 How/where 这是否存储取决于您,尽管一般来说我会声明您应该使用最好的工具来解决问题。 Initialization-Aggregate 例如 不会 是正确的位置,因为这会引入类似于 System-Aggregate 的内容。 我宁愿为手头的任务使用一个非常简单的专用查询模型,但这是我的直觉,给出了问题上下文。

最后,我认为 infra-layer 可以放入这个。 它应该是您 start-up 阶段的一部分。之后,如果您愿意,您基本上可以完全放弃此命令处理程序。

这是我对这种情况的两分钱,希望这对@PolishCivil 有所帮助!

我对Axon的了解不够,但是问题本身是一个通用的问题,下面是一个通用的解决方案。

您要找的模式是Composition Root.

组合根是应用程序中模块组合在一起的(最好)唯一位置。

它是您应用程序中发生 "composition of the object graphs" 的入口点。对象图只是一组对象,它们之间有或没有关系。

通常,在 Java 和 .NET 中,您将使用依赖项注入容器来执行此组合。但是确切的机制并不重要;它可以使用容器,也可以使用带有中心对象的纯 DI 手动完成。

这样的中心对象将 parse/store 配置、根据请求初始化域对象、初始化或存储外部基础设施连接,并且将成为更高初始化机制(如应用程序服务器)的主要入口点。

组合根是一个应用程序基础结构组件。

这意味着只有应用程序才应该有合成根。图书馆和框架不应该。此外,在构造对象图时,组合根通常引用配置并将正确的外部依赖项注入对象。

compose 对象图尽可能靠近应用程序的入口点。

这意味着您的所有应用程序代码都完全依赖于构造函数注入或域查找(或其他注入模式),并且永远不会被组合 ad-hoc。只有在应用程序的入口点才组成整个对象图。

根据您的应用程序,此入口点可能是:

  • 控制台应用程序中的 Main 方法
  • run 应用程序服务器提供的方法或启动挂钩(使用 Ruby 和 Python 等语言)
  • global.asax 和自定义 IControllerFactory,在 ASP.NET MVC 应用程序中
  • WPF 应用程序中的 Application.OnStartup 方法
  • WCF 中的自定义ServiceHostFactory
  • 等等。

阅读material: