はじめに
ASP.NETでDIを使いはじめたいと思っている人向けのガイドです。
リクエスト毎に生成と破棄をしたいリソース(DbContext等)を自動的に管理することを目標としています。
DIコンテナはMSのUnity を使用します。
パッケージのインストール
ASP.NET MVC5プロジェクトに、Unityのパッケージをインストールします。
- Unity bootstrapper for ASP.NET MVC 今のバージョンは 3.5.1404
プロジェクトのApp_Start
以下にUnityConfig.cs
とUnityMvcActivator.cs
が生成されます。
管理対象の登録
リクエスト毎に生成と破棄を自動的にやってもらいたいものをUnityに登録します。
UnityConfig.cs
を開き、RegisterTypes
メソッドの中に次のように記述します。
container.RegisterType<MyDbContext>(new PerRequestLifetimeManager(), new InjectionFactory(c => new MyDBContext()/*ここで生成処理*/));
最初の引数として new PerRequestLifetimeManger() を渡しているのがキモです。
これがリクエスト毎に生成と破棄を行ってくれます。
InjectionFactoryは生成時の処理を自由に記述するためのファクトリです。単にnewするだけでよいのであれば、
container.RegisterType<MyDbContext>(new PerRequestLifetimeManager()));
と書けばOKです。
HttpModuleの登録
UnityMvcActivator.cs
を開き、コメントアウトされている行を有効にします。
Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
使う!
ControllerやViewの生成はもうUnityの管理下です!Controllerのコンストラクタの引数としてMyDbContextをとるようにすれば、そこにUnityで生成されたインスタンスが自動的に渡ってきます。リクエスト終了時にはDispose()がちゃんと呼ばれます!