nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

ASP.NET MVC 5でAutofacを使う

ASP.NET MVC 5で、DI ContainerのAutofacを使う方法を簡単に記載したいと思います。

つぎの手順で適用します。

1. NuGetからパッケージをインストールする

インストールするパッケージはこちら。

www.nuget.org

こちらを適用してインストールした場合、Autofac本体は必ずしも最新が適用される訳ではありませんので、個別にアップデートすることをお勧めします。

2. Injection対象を作成する

とりあえずテスト用に次のようなインターフェースとクラスを作成しました。

public interface IMessenger
{
    string About { get; }
    string Contact { get; }
}

public class Messenger : IMessenger
{
    public string About => "About Message.";
    public string Contact => "Contact Message.";
}

これをコントローラーへInjectionします。

3. コントローラーへInjectionするコードを記述する

先ほど作成したクラスをコントローラーへInjectionするコードを記述します。

この例ではASP.NET MVC 5の標準テンプレートで作成されるHomeControllerクラスへInjectionしています。

public class HomeController : Controller
{
    private readonly IMessenger _messenger;
    public HomeController(IMessenger messenger)
    {
        _messenger = messenger;
    }

    public ActionResult Index() => View();

    public ActionResult About()
    {
        ViewBag.Message = _messenger.About;
        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Message = _messenger.Contact;
        return View();
    }
}

4. Global.asaxでContainerの初期化処理を記述する

Global.asaxのApplication_Startメソッドに、元々ある記述の後ろに次のように記述します。

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    var builder = new ContainerBuilder();
    // アセンブリ内部のControllerを全て一括登録する
    builder.RegisterControllers(typeof(MvcApplication).Assembly);
    // 注入したいオブジェクトをコンテナへ登録する
    builder.RegisterType<Messenger>().As<IMessenger>();
    var container = builder.Build();
    // ASP.NETへAutofacのDependencyResolverを登録する
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

なお詳細はこちらが参考になるでしょう。

http://autofaccn.readthedocs.io/en/latest/integration/mvc.html

以上です。