30

MVC 3 + EF 4.1

DbContext を処理するために、次の 2 つのアプローチから選択しています。

  1. でインスタンス化しApplication_BeginRequest、 に入れ、 で HttpContext.Current.Items破棄しApplication_EndRequestます。
  2. 使い捨ての UnitOfWork (の一種のラッパーDbContext) を作成し、各コントローラー アクションを次のように開始します。using(var unitOfWork = new UnitOfWork()) { ... }

あなたの経験を共有してください: どちらが好きですか? 各アプローチの長所と短所は何ですか?

4

3 に答える 3

18

依存性注入フレームワークを使用することをお勧めします。DbContextリクエストに応じて登録できます

 container.RegisterType<MyDbContext>().InstancePerHttpRequest();

そして、それをコンストラクターパラメーターとしてコントローラーに挿入します。

public class MyController : Controller
{
    public MyController(MyDbContext myDbContext)
    {
         _myDbContext = myDbContext;
    }
}

登録されたタイプが実装されているIDisposable場合、DI フレームワークはリクエストの終了時にそれを破棄します。

1 番目のアプローチ: 手動で実装するよりも、ID フレームワークを使用する方がはるかにクリーンです。さらに、すべてのリクエストで UoW が必要ない場合があります。

2 番目のアプローチ: コントローラーは、UoW(DbContext) を構築する方法を認識してはなりません。目的は、コンポーネント間の結合を減らすことではありません。

于 2011-08-09T00:40:58.093 に答える
2

現在、リポジトリ ファクトリからサービス ロケータを介してインスタンス化された UoW (作業単位) が注入されたリポジトリを使用しています。Unity はこのように寿命を制御し、作業をあなたから奪います。

特定の実装は、POCO やエンティティ オブジェクトなどを使用しているかどうかによって異なります。

最終的に、コントローラーで複数のオブジェクトセットを操作して、1 つのコンテキストのみを使用するようにする場合は、UoW が必要です。これにより、トランザクションがチェックされます。

複数のオブジェクト コンテキスト (つまり、複数の EDMX) を使用する場合は、MSDTC で UoW を使用することを検討する必要がありますが、それはおそらくあなたが知りたい以上のものです。最後に、重要なことは、コントローラー アクションに必要なもの (つまり、コンテキストの 1 つのインスタンス) をインスタンス化することです。私は Begin_Request を使用するとは思いません。すべてのリクエストのコンテキストさえ必要ないかもしれません。

于 2011-08-09T00:43:01.940 に答える