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.
有人知道吗?谢谢!
修改:
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内部执行时,已经太晚了,当前的操作上下文被处理或释放了。
任何见解仍将非常感激!