Предупреждение анализа кода CA2000: вызов Dispose для объекта 'new ContainerControlledLifetimeManager ()' - PullRequest
3 голосов
/ 15 июля 2010

Я получаю предупреждение анализа кода на некоторых из моих модульных тестов:

WidgetManagerTests.cs (40): CA2000: Microsoft.Надежность: в методе 'WidgetManagerTests.TestInitialize ()', вызов System.IDisposable.Dispose на новый объект ContainerControlledLifetimeManager ()» прежде чем все ссылки на него из Объем.

Я использую Unity и Moq, это оскорбительная строка:

var loggingServiceMock = new Mock<ILoggingService>();
            this.unityContainer.RegisterInstance<ILoggingService>(loggingServiceMock.Object, new ContainerControlledLifetimeManager());

1 Ответ

8 голосов
/ 22 июля 2010

Реализация CA2000 очень чувствительна к случаям, когда исключение может быть выдано до того, как одноразовый экземпляр будет «передан» другому методу. В этом случае, даже если контейнер в конечном итоге позаботится об очистке менеджера времени жизни, если во время регистрации не возникнет никаких исключений, исключение может возникнуть либо до вызова RegisterInstance, либо внутри вызова, но до того, как контейнер добавит менеджер времени жизни к своему собственное внутреннее состояние.

Чтобы рассмотреть эту возможность, вы можете использовать код, подобный следующему (хотя я, вероятно, не стал бы беспокоиться об этом сам, если бы расположение не сделало что-то существенное):

var loggingServiceMock = new Mock<ILoggingService>();

var lifetimeManager = new ContainerControlledLifetimeManager();
try
{
    this.unityContainer.RegisterInstance<ILoggingService>(loggingServiceMock.Object, lifetimeManager);
}
catch
{
    lifetimeManager.Dispose();
    throw;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...