gpt4 book ai didi

c# - 具有依赖注入(inject)的 CQRS

转载 作者:太空狗 更新时间:2023-10-30 01:02:41 26 4
gpt4 key购买 nike

这应该是一个非常快速的问题。我正在尝试学习 CQRS 模式,但有一件事尚不清楚。有两个调度程序:用于命令和查询。它们都需要注入(inject) DI 内核才能获得适当的处理程序。例如:

var handler = _resolver.Resolve<IQueryHandler<TQuery, TResult>>();

永远不要使用Resolve,一切都应该注入(inject)构造函数/属性,这是否违反了 DI 的概念?

还有一个更大的例子:http://www.adamtibi.net/06-2013/implementing-a-cqrs-based-architecture-with-mvc-and-document-db

请检查这个方法:

public void Dispatch<TParameter>(TParameter command) where TParameter : ICommand
{
var handler = _kernel.Get<ICommandHandler<TParameter>>();
handler.Execute(command);
}

我在 3 个不同的页面上找到了这个解决方案。为什么这样做而不是创建一个工厂来将 Query 映射到 QueryHandler?

最佳答案

如果您认为调度程序是基础架构的一部分,那么在其中调用 Resolve() 并不违反您描述的 DI 概念。

处理程序通常被认为是逻辑管道(或线程,或者您想要的任何方式)的入口点。这类似于 MVC 中的 Controller ,或控制台应用程序中的 Main() 方法。因此,与这些其他构造一样,调度程序被视为依赖链中的顶级对象,因此是引用容器的完全合法位置。

编辑

所以评论提到了复合根(CR),这是一个我喜欢但在这个答案中有意避免的术语,因为它容易让人感到困惑。 CR是一个特定的类吗?大会?我倾向于将其更多地视为一个概念,而不是一个特定的结构。它是应用程序中组成对象图的逻辑位置。

澄清我对 Controller 的意思: Controller 将是入口点,并且(如@Zbigniew 指出的那样) Controller 工厂将是 CR(的一部分)。同样,处理程序将是入口点,而调度程序将是 CR。 Handlers/Controllers 不会引用容器,但 Dispatcher/ControllerFactory 会有。

关于c# - 具有依赖注入(inject)的 CQRS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32756796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com