【发布时间】:2015-07-20 08:08:35
【问题描述】:
我正在开发一个 WCF 项目,其中我使用 Autofac 作为 IoC 容器,使用 MediatR 作为中介来执行我的请求和命令。
WCF 契约的“基础”实现将IMediator 的实例作为依赖项,将与每个请求关联的工作委托给关联的处理程序。我还有几个装饰器,我为授权和错误处理等基础实现堆叠起来。
如this page of Autofac documentation 中所述,当您在服务实现上使用装饰器时,必须使用MultitenantServiceImplementationDataProvider 以满足WCF 内部要求。不需要更多与多租户相关的内容,因此它只包含:
AutofacServiceHostFactory.ServiceImplementationDataProvider = new MultitenantServiceImplementationDataProvider();
此外,在.svc 中,我指定了接口的限定名称,因为它受 Autofac 支持,并且我的基本实现上具有装饰器。
现在,转到 MediatR。
MediatR 在收到请求时使用服务位置实例化适当的处理程序。更具体地说,它依赖于CSL。
没问题,因为 Autofac 提供了bridge to support CSL。
“棘手”部分依赖于我的处理程序将 DbContext 作为依赖项这一事实,我希望在每次 WCF 请求后由 Autofac 处理它们。
因此,AutofacServiceLocator 必须被赋予为特定请求创建的范围,因为根范围没有被释放,DbContext 实例也不会被释放。
Autofac 为您提供了 AutofacInstanceContext.Current 静态属性,它相当于 ASP.NET MVC 中的 AutofacDependencyResolver.RequestLifetimeScope。
到目前为止一切顺利,以下是我注册 ServiceLocatorProvider 的方法,Mediator 类依赖于:
builder
.Register(x => new ServiceLocatorProvider(() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)))
.InstancePerLifetimeScope();
它在我的开发盒上按预期工作,但我在暂存环境中收到 NullReferenceException,我真的不知道在哪里寻找 - GoogleBing 没有给出相关结果。
只有与两种环境不同的东西:
- 我的盒子上的 HTTP 与暂存环境上的 HTTPS。
-
debugattribute on<system.web>元素在暂存环境中设置为 false。
就是这样......
.NET 框架一样,4.5.2。
有人有想法吗? 谢谢!
【问题讨论】: