通过传递IContainer(AutoFac)来启动范围

时间:2019-03-28 12:25:31

标签: dependency-injection scope autofac

从消息处理程序(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时处理程序被处理。

1 个答案:

答案 0 :(得分:0)

  

问题是,绕过IContainer是否是反模式?

这取决于其用途。 Dependency Injection PP&P描述(在§5.2中),为Composition Root之外的应用程序组件提供对一组无限依赖关系的访问是一种称为 Service Locator 的反模式。

在您的情况下,IContainer接口允许访问无限制的一组依赖关系。这是因为其Resolve<T>方法允许您解析任何类型。这使IContainer接口成为成为服务定位符的候选对象。但是,是否将其用作服务定位器取决于其使用方式。

这本书非常精确地将服务定位符定义为在“组合根之外”应用的一种模式,它引用了容器,或者在“组合根”内的任何此类抽象都不会带来相同的负面影响。

换句话说,您可以随意将IContainer注入到您的班级中,例如MessageHandler,只要在应用程序的“合成根目录”内内部中定义了该实现即可。这将使MessageHandler成为基础结构组件。