繁体   English   中英

“ CA2000:在失去作用域之前处理对象”,构建Unity容器

[英]“CA2000: Dispose object before losing scope” building Unity container

我正在使用以下代码来获取fxCop变形CA2000:在失去作用域之前处理对象:

private static IUnityContainer BuildContainer()
{
   var container = new UnityContainer().LoadConfiguration();
   return container;
}

为了消除这种违规,我使用了以下代码:

   private static IUntyContainer BuildContainer()
    {
        using(var container = new UnityContainer())
        {
           return container.LoadConfiguration();
        }
    }

但是这段代码在解决依赖关系时开始引发异常。

有人可以帮我弄这个吗?

尽管您应该查看CA2000的“ 帮助”页面以获取更多信息,但这种冲突通常源于几种代码模式。

  • 工厂方法
  • 方法链
  • 缺少或不正确的异常处理

对于没有其他错误的纯工厂方法,在某些情况下仅重命名方法就足够了。 我不知道规则要查找的前缀是什么,但是您可以尝试ConstructCreateNewBuild (您拥有的前缀)。

但是,就CA2000而言,这并不是此方法的问题。

因此,让我们看一下相关代码:

var container = new UnityContainer().LoadConfiguration();

在这里,我将假定LoadConfiguration是一种方法,该方法返回的调用实例与流式接口链接的实例相同。

换句话说,该方法看起来像这样:

public class UnityContainer
{
    public UnityContainer LoadConfiguration()
    {
        // load
        return this;
    }
}

代码分析引擎现在可以看到以下代码:

var temp = new UnityContainer();
var container = temp.LoadConfiguration();
return container;

temp发生了什么? 它无法检测到(请参阅下面的注释)同一实例,因此认为您在此处丢失了该temp实例,因此应将其处置。

好的,那么将代码更改为此:

var container = new UnityContainer();
container.LoadConfiguration();
return container;

现在,根据相同的规则,我又遇到了另一个违规:

CA2000 :在方法“ Program.BuildContainer()”中,未沿所有异常路径放置对象“容器”。 在对对象“容器”的所有引用超出范围之前,请调用System.IDisposable.Dispose。 ConsoleApplication31 C:\\ Dev \\ VS.NET \\ ConsoleApplication31 \\ ConsoleApplication31 \\ Program.cs 18有效

基本上,代码分析引擎现在想知道,如果LoadConfiguration引发异常,那么您将泄漏从未返回的临时容器对象。

因此,这是此方法的“固定”版本:

var container = new Container();
try
{
    container.LoadConfiguration();
    return container;
}
catch (Exception) // NOTE!
{
    container.Dispose();
    throw;
}

注意! :仅处理您知道或认为LoadConfiguration可以抛出的特定异常,而不处理Exception

注意 :当我在上面说“无法检测”时,并不意味着代码分析引擎已在适当的位置检测到了失败或存在错误的代码,这还意味着规则根本没有做那么深入的工作。分析,例如查看LoadConfiguration方法并确定它始终返回this

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM