2017-10-02 19 views
0

私は、オブジェクトがすでにnullの場合はusingステートメントを初期化する方法があるはずのように私は感じて、このコードは少し重複することにしようとしていセットアップ

public static CMSContent GetContent(string title, ContextDb db = null) 
    { 
     if (db == null) 
     { 
      using (db = new ContextDb()) 
      { 
       return db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
      } 
     } 
     else 
     { 
      return db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
     } 

    } 

これは、呼び出しステートメントが返されたオブジェクトに対して追加のdb要求を実行したり、いくつかの呼び出しがあり、事前に複数の接続を緩和するために接続が設定されている可能性があるからです。

return文が重複できない場合は、dbがnullの場合はthenを使用してください。

+0

これは私にはデザインの混乱のように見えます。メソッドは単純ですが、これは良い方法ですが、メソッドの責任は何かについては少し混乱しているようです。データを取得したり、コンテキストを作成することは意味ですか?メソッドを与えすぎると、上記のような問題が発生します。 – Nkosi

+0

これは私がプログラムする方が好きではありませんが、それは古いプロジェクトであり、私はチームに所属しており、書き直すことはできません。 – Tod

+0

あなたは縛られています。 usingステートメントはスコープ・ベースなので、スコープがそのメソッドを越えてdbを作成し、指定されたdbが使用スコープ内にない場合は、指定されたdbが存在するかどうかを判断する方法もありません。 – Nkosi

答えて

0

usingのドキュメントを参照すると、finally句のDispose()を呼び出すと同じ動作を実現できます。

編集:Nkosiのコメントに関して、最初にdbがヌルであったかどうかを覚えておく必要があります。結果のコードが実際に改善されているかどうかわからない、少なくともreturn文がもはや重複しない...

public static CMSContent GetContent(string title, ContextDb db = null) { 
    var dbWasNull = (db == null); 
    try { 
     if (dbWasNull) { 
      db = new ContextDb(); 
     } 
     return db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
    } 
    finally { 
     if (dbWasNull) { 
      db.Dispose(); 
     } 
    } 
} 
+1

この問題は、OPがこのメソッドの外部にあるDBにアクセスしたい場合、次のようなエラーが発生します。 – Nkosi

+0

これは、 'db == null'が真である場合、これはまったく同じ動作です:(私はこれを修正するために私のコードを編集しました。 –

0

は私が編集したとして、ゲオルクの答えを取って、少しそれをトリミング:

public static CMSContent GetContent(string title, ContextDb db = null) 
    { 
     var _db = db ?? new ContextDb(); 

     try 
     { 
      return _db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
     } 
     finally 
     { 
      if (db == null) _db.Dispose(); 
     } 
    } 

私はより良い答えのために多くの狩りをしました。私はそれを見つけることができません。これを行わずに、シングルトンによって管理される接続プールを持っていることを除いては、おそらくそうではありません。しかし、これはここでは実用的ではないし、うまくいけば、これは他の誰かを助けるために役立つだろ

私は、文脈を破棄してGCにそれをさせないというアイデアを思いついたのですが、私がしたら私は夜に眠ることができないと思いました。

public static CMSContent GetContent(string title, ContextDb db = null) 
{ 
    return (db ?? new ContextDb()).CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived); 
} 

ええ - そうしないでください。どうやらEF5はそれでOKだったと思いますが、自動的に接続を閉じるものがありますが、EF6はそうではありません。使い捨てならば処分してください。