AutofacInstanceContext.Current是空的,我不知道为什么

本文关键字:我不知道 为什么 Current AutofacInstanceContext | 更新日期: 2023-09-27 18:03:26

我正在研究一个WCF项目,其中我使用Autofac作为IoC容器,MediatR作为中介来执行我的请求&命令。

WCF契约的"基本"实现采用IMediator的实例作为依赖项,将与每个请求相关的工作委托给相关的处理程序。我也有几个装饰器,我堆叠的基本实现,如授权和错误处理。

正如Autofac文档的这一页所指定的,当您在服务实现上使用装饰器时,为了满足WCF内部的要求,使用MultitenantServiceImplementationDataProvider是必要的。不需要更多与多租户相关的内容,因此它只包含以下内容:

AutofacServiceHostFactory.ServiceImplementationDataProvider = new MultitenantServiceImplementationDataProvider();

另外,在.svc中,我指定了接口的限定名称,因为它是由Autofac支持的,并且我在我的基本实现上有装饰器。

现在,来看看MediatR。
MediatR在收到请求时使用服务位置实例化适当的处理程序。更具体地说,它依赖于CSL。

这不是问题,因为autoface提供了一个桥接来支持CSL。
"棘手"的部分依赖于这样一个事实,即我的处理程序将DbContext作为依赖项,我希望它们在每个WCF请求后由autofacc处理。因此,AutofacServiceLocator必须被赋予为特定请求创建的作用域,因为根作用域没有被处理,DbContext实例也不会被处理。

Autofac为您提供了AutofacInstanceContext.Current静态属性,相当于ASP中的AutofacDependencyResolver.RequestLifetimeScope。净MVC。
到目前为止一切顺利,下面是我如何注册ServiceLocatorProvider, Mediator类依赖于:

builder
    .Register(x => new ServiceLocatorProvider(() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)))
    .InstancePerLifetimeScope();

它在我的开发箱上如预期的那样工作,但我在staging环境上得到NullReferenceException,我真的不知道在哪里寻找- GoogleBing没有给出相关的结果。

只有在两个环境中不同的东西:

  • 我的机器上的HTTP vs登台环境中的HTTPS。
  • <system.web>元素的debug属性被设置为false。

就是这样……
. net框架相同,4.5.2.

有人知道吗?谢谢!

AutofacInstanceContext.Current是空的,我不知道为什么

修改:

builder
    .Register(x => new ServiceLocatorProvider(() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)))
    .InstancePerLifetimeScope();

builder
    .Register(x => 
    {
        var serviceLocator = new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime);
        return new ServiceLocatorProvider(() => serviceLocator);
    }
    .InstancePerLifetimeScope();

我不能确切地告诉你为什么它不起作用,但我猜,当lambda表达式() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)被MediatR内部执行时,已经太晚了,当前的操作上下文被处理或释放了。

任何见解仍将非常感激!