依存性注入は、間違いなくあなたが求めているもののように聞こえます。私の好みは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 で私のプロジェクトを確認してください。