簡體   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