1

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

WCF 契约的“基础”实现将 的实例IMediator作为依赖项,以将与每个请求关联的工作委托给关联的处理程序。我还有几个装饰器,我为授权和错误处理等基础实现堆叠起来。

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

AutofacServiceHostFactory.ServiceImplementationDataProvider = new MultitenantServiceImplementationDataProvider();

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

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

没问题,因为 Autofac 提供了支持 CSL 的桥梁
“棘手”部分依赖于我的处理程序作为依赖项这一事实,DbContext我希望 Autofac 在每次 WCF 请求后将它们处理掉。
因此必须给定为特定请求创建的范围,因为根范围没有被释放,实例AutofacServiceLocator也不会。DbContext

Autofac 为您提供了与ASP.NET MVCAutofacInstanceContext.Current中等效的静态属性。 到目前为止一切顺利,以下是我注册该类的方式:AutofacDependencyResolver.RequestLifetimeScope
ServiceLocatorProviderMediator

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

它在我的开发盒上按预期工作,但我NullReferenceException在暂存环境中得到了一个,我真的不知道在哪里寻找 - GoogleBing 没有给出相关结果。

只有与两种环境不同的东西:

  • 我的盒子上的 HTTP 与登台环境上的 HTTPS。
  • debug在暂存环境中,元素上的属性<system.web>设置为 false。

就是这样......
.NET 框架和 4.5.2 一样。

有人有想法吗?谢谢!

4

1 回答 1

1

Fixed it by changing:

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

with

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

I wouldn't be able to tell you exactly why it didn't work, but I guess that by the time the lambda expression () => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime) was executed internally by MediatR, it was too late and the current operation context was disposed of or released.

Any insight would still be greatly appreciated!

于 2015-07-20T15:01:52.480 回答