2012-12-21 41 views
5

私はかなり単純なDIパターンを使用して自分のコントローラクラスにデータリポジトリを注入していますが、CA2000コード分析警告(スコープを失う前にオブジェクトを廃棄する)が表示されています。私は警告が起こっている理由を知っており、通常はそれを修正する方法を見つけ出すことができますが、この場合には、私は、オブジェクトの作成と返すメソッドの間にスローされた例外のいずれかの可能性があるどのようにCA2000と依存性注入

  1. を把握することはできません、または
  2. 私はtry/finallyブロックを入れてエラーを取り除くことができます。

警告メッセージを全面的に放棄して表示しないようにする前に、潜在的な不在オブジェクトにならない同じ効果を達成するより良い方法がありますか?

public class AccountController : Controller 
{ 
    public AccountController() 
     : this(new SqlDataRepository()) 
    { 
    } 

    public AccountController (IDataRepository db) 
    { 
     this.db = db ?? new SqlDataRepository(); 

     // Lots of other initialization code here that I'd really like 
     // to avoid duplicating in the other constructor. 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (this.db != null)) 
     { 
      IDisposable temp = this.db as IDisposable; 
      if (temp != null) 
      { 
       temp.Dispose(); 
      } 
     } 
    } 
} 
+1

いずれにしても、 'Dispose'メソッドの'(this.db!= null) 'は、数行の行をもう一度ヌルチェックすると冗長です。また、 'Dispose'メソッドの最後に' base.Dispose(disposing) 'を呼んで、' Controller'の 'Dispose'も適切にクリーンアップしていることを確認することもできます。 –

答えて

1

ASP.Net MVCを使用している場合は、コントローラーにIDisposableを実装させることができます。パイプラインによって処理が行われます。 ASP MVC: When is IController Dispose() called?を参照してください。

+0

'Controller'は既に' IDisposable'を実装していますので、すでに起こっていたと思います。とにかく、 'IDisposable'を明示的に実装しても効果はありません。 –

+1

静的解析では、処分が有効であるとは判断できない場合がありますが、処分されているため、エラーを無視しても安全です。 –

0

あなたのリポジトリはIDisposableを実装しています。あなたのコントローラにもIDisposableを実装させ、disposeメソッドでリポジトリをクリーンアップします。