DDD域Init事件 /应用程序首次启动



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

我有应该用特定价值初始化的服务,以进行更多的斗争,假设我希望将来首次启动应用程序时初始化一些聚合。

如果我在带有DDD概念的CQR中正确理解,每次应用程序启动时,我都可以发出命令,在命令处理程序中,我只会检查不变的东西是否已经初始化,我只是丢弃这个命令,然后什么都没发生。

最大的问题是我不确定应该在哪里放置这种启动/初始化行为,似乎应该驻留在基础架构层中。

非常感谢:(

我对轴突不太了解,但是问题本身是通用的,下面是通用解决方案。

您要寻找的模式是 Composition Root

组合根是一个(最好是(在一个应用程序中组成的应用程序中的唯一位置。

这是您应用程序中的一个入口点,其中"对象图的组成"发生。对象图只是对象的组,它们之间有或没有关系。

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

这样一个中心对象将解析/存储配置,按请求初始化域对象,初始化或存储外部基础架构连接,并且将成为更高初始化机制(如应用程序服务器(的主要入口点。

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

这意味着仅应用程序应具有组成根。图书馆和框架不应。另外,在构造对象图的同时,组成词根通常是指配置并将正确的外部依赖项注入对象。

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

这意味着您的所有应用程序代码仅依赖于构造函数注入或域查找(或其他注入模式(,并且永远不会组成临时。仅在应用程序的入口点是整个对象图。

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

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

阅读材料:

  • 了解组成词
  • 构图根
  • 依赖注入 - 组成根
  • 如何重构依赖注入,第2部分:组成词

我认为我个人有一个专门用于此'第一个应用程序启动'的命令。然后,您将拥有一个命令处理组件,该组件的唯一目的是确定它是否是应用程序的第一个启动。

如果是,则您发出后续命令以启动其他操作。如果否,您将完全忽略命令,也许会记录起初始化的决定。要提出这一决定,您当然需要将此状态设置在某个地方。如何/存储在哪里取决于您,尽管总的来说,我应该说您应该使用最佳工具解决问题。例如的初始化 - 聚集在一起,因为这将沿着系统聚集的线条引入某些内容。我宁愿为手头的任务提供一个非常简单的专用查询模型,但这是我的直觉上下文。

最后,我认为将其放入它会很好。它应该是您启动阶段的一部分。之后,如果您觉得自己可以完全放弃此命令处理程序。

那是我对情况的两美分,希望这对@polishcivil!

最新更新