4

新しい ASP.NET MVC プロジェクトを開始しています。私の最後のプロジェクトでは、コードの最大の臭いの 1 つは、Entity Framework DbContext をどのように渡し、それを HttpContext.Current に格納し、レンダリング イベントで SaveChanges() を呼び出し、あらゆる種類の (おそらく見苦しい) 関連することを行った方法でした。

私の作業単位は常に Web 要求に対応しているとします。DbContext を作成し、そのコンテキストをビジネス ライブラリ (たとえば、一部のワークフロー アクティビティの処理を担当する MVC プロジェクト外のアセンブリ) に共有し、結果モデルをコントローラーに共有し、変更を永続化する正しい方法は何ですか?

正直なところ、私は依存性注入についてあまり知りません。関連しているように思えますが、コントローラーと外部アセンブリ内のビジネス プロセスとの間で共有コンテキスト インスタンスを取得する方法がわかりません。

コントローラーからのみ必要な場合は、簡単です。私は HttpContext に固執します。しかし、今では HttpContext が外部ライブラリにあふれています。現在の DbContext を返すインターフェイスを定義し、その実装を HttpContext に基づいて作成するだけですか?

少し迷っているので、私が求めていることが明確であることを願っています。

4

1 に答える 1

3

依存性注入は、間違いなくあなたが求めているもののように聞こえます。私の好みはninjectなので、以下はEFでこれを行う方法の例です。

Ninject.MVC3 をインストールします (nuget で利用可能)

\app_start\NinjectWebCommon.cs (上記のパッケージで追加) に移動し、以下を RegisterServices メソッドに追加します。

kernel.Bind<MyContext>().ToSelf().InRequestScope(); //binding in the context in request scope, this will let us use it in our controllers 

コントローラー内では、次のようにコンテキストを消費します

public class MyController : ....{
   private readonly MyContext _context;
   public MyController(MyContext context){ _context = context; }
   //Do stuff with _context in your actions
}

これは非常に簡単な例ですが、アプリケーションの成長に合わせてこれを構造化するより良い方法 (ninject モジュールなど) はたくさんありますが、これは DI がどのように機能するかを示しています。

注意すべき点がいくつかあります。DBContext は、長すぎるとかなり大きくなるという厄介な習慣があるため、常に requestscope で (またはより頻繁に) コンテキストをバインドするようにしてください。

注入できる外部のものと共有するという点では、たとえば

public class MyExternalLogic{
    public MyExternalLogic(MyContext context){....}
}

public class MyController : ....{
   private readonly MyContext _context;
   public MyController(MyContext context, MyExternalLogic logic){ _context = context; ...}
   //Do stuff with _context in your actions
}

上記では、DbContext の同じインスタンスが MyController と MyExternalLogic の両方に使用されます。Ninject は両方のオブジェクトの作成を処理します。

非常によく似たエクスペリエンスを提供する、他にも多数の DI コンテナーが利用可能です。DI は単体テスト能力にも大いに役立つため、強くお勧めします。

Ninject を使用して MVC アプリを構築する方法の例については、https://github.com/lukemcgregor/StaticVoid.Blogなどの github で私のプロジェクトを確認してください。

于 2013-04-27T00:47:43.170 に答える