私はMVCでプロジェクトを持っています。私たちはDB取引のためにEFを選択しました。私たちは、BLL層のマネージャーをいくつか作成しました。私たちはDBcontext MyEntities()
の新しいインスタンスを作成します。ここEF(エンティティフレームワーク) "using"ステートメントの使用
public Item GetItem(long itemId)
{
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
}
すなわち
、「using
」文が使用されている例の多くは、発見しました。
"ensure the correct use of IDisposable objects."
私のマネージャーでは1つの方法です。しかし私には10以上のものがあります。 マネージャからメソッドを呼び出すたびに、私は "using
" statemantを使用し、 メモリに別のDBcontextを作成します。ガベージコレクタ(GC)がそれらを処分するとき?知るか?
しかし、マネージャメソッドの別の使用方法があります。 私たちは、グローバル変数を作成:
private readonly MyEntities db = new MyEntities();
をし、「using
」文なしであらゆる方法でDBcontextを使用しています。そして、この方法は、次のようになります。
public Item GetItem(long itemId)
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
質問:
- DBcontext変数を使用しての適切な方法は何ですか?
- "
usage
"ステートメントを使用しないと(パフォーマンスに影響するため) - GCはそれをすべて行いますか?
私はEF使用の "ルーキー"ですが、この質問の一義的な答えはまだ見つかりませんでした。
あなたがそれをどれくらい遠くにしたいかによって異なります。理想的にはあなたのコントローラーでそれをインスタンス化するのではなく、**コントローラを呼び出すコントローラ(Factory)がContextの存続期間を決定できるように**注入(IoC/DI)します。 – Belogix
なぜパフォーマンスに影響しますか?あなたはそれを測定して、あなたがパフォーマンスを失っていると結論づけましたか? GCはそれを処理していないので、使用しているステートメントを使用しているので、自分で処分しています。 – Maarten