C# AutoFacinInstanceContext.Current为null且我不使用';我不明白为什么
我正在从事一个WCF项目,其中我使用Autofac作为IoC容器,使用MediatR作为中介来执行我的请求和命令 WCF契约的“基本”实现将C# AutoFacinInstanceContext.Current为null且我不使用';我不明白为什么,c#,wcf,autofac,mediatr,C#,Wcf,Autofac,Mediatr,我正在从事一个WCF项目,其中我使用Autofac作为IoC容器,使用MediatR作为中介来执行我的请求和命令 WCF契约的“基本”实现将IMediator的一个实例作为依赖项,将与每个请求相关联的工作委托给相关的处理程序。我还有几个装饰器,我为授权和错误处理等基本实现堆叠它们 如中所述,在服务实现上使用decorator时,为了满足WCF内部要求,必须使用MultitenantServiceImplementationDataProvider。不需要更多与多租户相关的内容,因此它只包括: A
IMediator
的一个实例作为依赖项,将与每个请求相关联的工作委托给相关的处理程序。我还有几个装饰器,我为授权和错误处理等基本实现堆叠它们
如中所述,在服务实现上使用decorator时,为了满足WCF内部要求,必须使用MultitenantServiceImplementationDataProvider
。不需要更多与多租户相关的内容,因此它只包括:
AutofacServiceHostFactory.ServiceImplementationDataProvider=新的MultitenantServiceImplementationDataProvider();
另外,在.svc
中,我指定了接口的限定名称,因为它受Autofac支持,并且我在基本实现的顶部有装饰器
现在,转到MediatR。MediatR在收到请求时使用服务位置实例化适当的处理程序。更具体地说,它依赖于 这不是问题,因为Autofac提供了一个。
“棘手”部分依赖于这样一个事实:我的处理程序将
DbContext
作为依赖项,我希望在每次WCF请求后由Autofac处理它们。因此,必须为
AutofacServiceLocator
指定为特定请求创建的作用域,因为根作用域未被释放,而且DbContext
实例也不会被释放
Autofac为您提供了AutoFacinInstanceContext.Current
静态属性,该属性相当于ASP.NET MVC中的AutofacDependencyResolver.RequestLifetimeScope
。到目前为止还不错,下面是我如何注册
ServiceLocatorProvider
的Mediator
类依赖于:
builder
.Register(x=>new ServiceLocator提供程序(()=>new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)))
.InstancePerLifetimeScope();
它在我的开发环境中按预期工作,但在登台环境中我得到了一个NullReferenceException
,我真的不知道该去哪里寻找-谷歌没有给出相关的结果
只有与这两种环境不同的东西:
- 我的盒子上的HTTP与登台环境上的HTTPS
- 在登台环境中,
元素上的
属性设置为falsedebug
.NET框架与4.5.2相同 有人有主意吗? 谢谢 通过更改来修复它:
builder
.Register(x => new ServiceLocatorProvider(() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)))
.InstancePerLifetimeScope();
与
我无法确切地告诉您为什么它不起作用,但我想当lambda表达式()=>新的AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)
由MediatR在内部执行时,已经太晚了,当前的操作上下文已被释放或释放
如果您有任何见解,我们将不胜感激 您正在使用哪个版本的MediatR?它已经从公共服务定位器转移到工厂方法代理,我正在使用最新的稳定版本1.0.0。Jimmy说如果我没弄错的话,在.NET内核稳定之前,他不会让2.0稳定。无论如何,我认为这不会对我的问题有多大改变
builder
.Register(x =>
{
var serviceLocator = new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime);
return new ServiceLocatorProvider(() => serviceLocator);
}
.InstancePerLifetimeScope();