Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AutoFacinInstanceContext.Current为null且我不使用';我不明白为什么_C#_Wcf_Autofac_Mediatr - Fatal编程技术网

C# AutoFacinInstanceContext.Current为null且我不使用';我不明白为什么

C# AutoFacinInstanceContext.Current为null且我不使用';我不明白为什么,c#,wcf,autofac,mediatr,C#,Wcf,Autofac,Mediatr,我正在从事一个WCF项目,其中我使用Autofac作为IoC容器,使用MediatR作为中介来执行我的请求和命令 WCF契约的“基本”实现将IMediator的一个实例作为依赖项,将与每个请求相关联的工作委托给相关的处理程序。我还有几个装饰器,我为授权和错误处理等基本实现堆叠它们 如中所述,在服务实现上使用decorator时,为了满足WCF内部要求,必须使用MultitenantServiceImplementationDataProvider。不需要更多与多租户相关的内容,因此它只包括: A

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

WCF契约的“基本”实现将
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
  • 在登台环境中,
    元素上的
    debug
    属性设置为false
就这样…
.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();