最近,我正在努力实现DDD应用程序的“初始”逻辑。
我有应使用特定值初始化的服务,以进行更多的工作,比方说,我希望将来在应用程序首次启动时初始化一些聚合。
如果我对带有DDD概念的CQRS有正确的理解,那么我可以在每次应用程序启动时发出一条命令,并且在命令处理程序中,我只会检查是否已初始化该事物,基本上是在已注册一些持久状态的情况下进行,我只会放弃该命令,然后像什么都没有发生一样。
最大的问题是,我不确定应该将这种启动/初始化行为放在哪里,似乎应该驻留在基础结构层中。
非常感谢:)
答案 0 :(得分:2)
我想我个人会有一个专用于此“首次启动应用程序”的命令。 然后,您将拥有一个命令处理组件,其唯一目的是确定它是否是应用程序的首次启动。
如果是,则发出后续命令以启动其他一些操作。
如果否,那么您将完全忽略该命令,或者记录是否已决定初始化。
为了做出这个决定,您当然需要将此状态设置为某个位置。
虽然通常我会建议您使用最佳工具来解决问题,但这取决于您的存储方式/位置。例如,初始化汇总(
最后,我认为将其放入基础层会很好。 它应该是您启动阶段的一部分。之后,如果您愿意,可以基本上完全删除此命令处理程序。
那是我的两分钱,希望这对@PolishCivil有帮助!
答案 1 :(得分:2)
我对Axon不够了解,但是问题本身是一个通用的问题,接下来是一个通用的解决方案。
您要查找的模式是 Composition Root
。
组合根是应用程序中将模块组合在一起的(最好)唯一位置。
这是应用程序中“对象图的组成”发生的入口。对象图只是一组对象,它们之间有或没有关系。
通常,在Java和.NET中,您将使用依赖项注入容器来执行此组合。但是确切的机制并不重要。它可以使用容器,也可以使用带有中心对象的纯DI手动完成。
这样的中央对象将解析/存储配置,根据请求初始化域对象,初始化或存储外部基础结构连接,并且将成为更高初始化机制(如应用程序服务器)的主要入口点。
合成根是应用程序基础结构组件。
这意味着仅应用程序应具有合成根。库和框架不应该。另外,在构造对象图时,组合根通常引用配置,并将正确的外部依赖项注入到对象中。
compose
对象图应尽可能靠近应用程序的入口点。
这意味着您的所有应用程序代码都完全依赖于构造函数注入或域查找(或其他注入模式),并且绝不是临时组成的。只有在应用程序的入口处,才可以构成整个对象图。
根据您的应用程序,此入口点可能是:
run
方法或启动挂钩(使用Ruby和Python等语言)IControllerFactory
Application.OnStartup
方法ServiceHostFactory
阅读材料: