从消息处理程序(Rebus)中使用MediatR。消息处理程序是上下文处理和生存的地方。思考以下内容:
public class MessageHandler: IHandleMessages<Thing> {
public MessageHandler(
IContainer container
// other dependencies
) {
Container = container;
...
}
protected IContainer Container { get; }
public async Task Handle(Thing message)
{
using(var scope = Container.BeginLifetimeScope())
{
var mediator = scope.Resolve<IMediator>();
mediator.Send(new SuperCommand { .... super paramters });
}
}
}
问题是,绕过IContainer是否是反模式?通常将带有AutoFac的MediatR配置为解决查询|通过IComponentContext
命令处理程序,以便在处理IMediator时处理程序被处理。
答案 0 :(得分:0)
问题是,绕过IContainer是否是反模式?
这取决于其用途。 Dependency Injection PP&P描述(在§5.2中),为Composition Root之外的应用程序组件提供对一组无限依赖关系的访问是一种称为 Service Locator 的反模式。
在您的情况下,IContainer
接口允许访问无限制的一组依赖关系。这是因为其Resolve<T>
方法允许您解析任何类型。这使IContainer
接口成为成为服务定位符的候选对象。但是,是否将其用作服务定位器取决于其使用方式。
这本书非常精确地将服务定位符定义为在“组合根之外”应用的一种模式,它引用了容器,或者在“组合根”内的任何此类抽象都不会带来相同的负面影响。
换句话说,您可以随意将IContainer
注入到您的班级中,例如MessageHandler
,只要在应用程序的“合成根目录”内内部中定义了该实现即可。这将使MessageHandler
成为基础结构组件。