我在某些单元测试中收到代码分析警告:
WidgetManagerTests.cs(40):CA2000: Microsoft.Reliability:方法 'WidgetManagerTests.TestInitialize()', 调用System.IDisposable.Dispose on 对象'新的 ContainerControlledLifetimeManager()” 在所有引用它之前 范围。
我正在使用Unity和Moq,这是违规行:
var loggingServiceMock = new Mock<ILoggingService>();
this.unityContainer.RegisterInstance<ILoggingService>(loggingServiceMock.Object, new ContainerControlledLifetimeManager());
答案 0 :(得分:8)
CA2000实现对于在将一次性实例“切换”到另一个方法之前可能抛出异常的情况非常敏感。在这种情况下,即使容器在注册期间没有异常发生时最终会负责清理生命周期管理器,但可能在RegisterInstance调用之前或在调用期间但在容器将生命周期管理器添加到其之前发生异常。自己的内部状态。
为了解决这种可能性,你可以使用类似下面的代码(虽然我可能不会自己打扰这个,除非处置做了一些重要的事情):
var loggingServiceMock = new Mock<ILoggingService>();
var lifetimeManager = new ContainerControlledLifetimeManager();
try
{
this.unityContainer.RegisterInstance<ILoggingService>(loggingServiceMock.Object, lifetimeManager);
}
catch
{
lifetimeManager.Dispose();
throw;
}