我正在开发一个 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
ServiceLocatorProvider
Mediator
builder
.Register(x => new ServiceLocatorProvider(() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)))
.InstancePerLifetimeScope();
它在我的开发盒上按预期工作,但我NullReferenceException
在暂存环境中得到了一个,我真的不知道在哪里寻找 - GoogleBing 没有给出相关结果。
只有与两种环境不同的东西:
- 我的盒子上的 HTTP 与登台环境上的 HTTPS。
debug
在暂存环境中,元素上的属性<system.web>
设置为 false。
就是这样......
.NET 框架和 4.5.2 一样。
有人有想法吗?谢谢!