我正在运行托管在 Windows 服务中的 WCF 服务;WCF 服务的依赖项是通过 Unity 注入的,这一切都很好。因此,该服务也很容易为其编写单元测试。
最近,我向服务中添加了使用 OperationContext 检查传入消息的功能。不幸的是,由于微软对密封和/或静态类的喜爱以及缺乏接口和/或虚拟方法,这反而使服务的可测试性失去了意义。
所以在这种情况下,我求助于 .NET 人最喜欢的工具,一个包装类。由于这是一个常见问题,因此有人已经为我们完成了艰苦的工作。因此,这为我的 WCF 服务添加了一个新的依赖项,即 IOperationContext 的实现。这对我的单元测试来说没问题,NSubstitute 是我选择的模拟框架(就像 Moq,但没有.Object
.
但是,当我尝试真正启动服务时,我遇到了以下问题 - 正在包装的 OperationContext 在 IoC 容器注册完成时尚未初始化。我的初始化代码(在这里使用 Unity)是:
container.RegisterType<IOperationContext, OperationContextWrapper>(new InjectionConstructor(OperationContext.Current));
但是此时,OperationContext.Current
是null
,所以 Unity 立即抛出异常,我的 40 岁之前退休的梦想付诸东流。
所以,问题是:如何让 WCF 与 DI 和 Wrapped 很好地配合使用OperationContext
?