web-dev-qa-db-ja.com

global.asax.csに依存関係を挿入する方法

Global.asax.cs、つまりMvcApplicationクラスに依存関係を注入するにはどうすればよいですか?

以前に依存性注入にServiceLocator(アンチ)パターンを使用したことがあるので、IOCコンテナー(具体的にはUnity.Mvc3が付属しているため)を使用して、最新のMVCアプリケーションのベストプラクティスのアドバイスに従おうとしています。すぐに使用できるIDependencyResolverの実装)とコンストラクターの注入。

いくつかの障害を除いて、これまでのところすべてが非常に単純に見えます。そのうちの1つはglobal.asax.csにあります(もう1つはカスタム属性用ですが、SOそれをカバーするための質問があります) )。

次のようなMvcApplicationクラスのHttpApplicationイベントハンドラー。

Application_Start()
Application_EndRequest(object sender, EventArgs e)
Application_AcquireRequestState(object sender, EventArgs e)

外部依存関係が必要になる場合があります。 ILogServiceへの依存。それでは、サービスロケーター(アンチ)パターンに頼らずにそれらを注入するにはどうすればよいですか?.

private static ILogService LogService
{
    get
    {
        return DependencyResolver.Current.GetService<ILogService>();
    }
}

どんな助け/アドバイスも大歓迎です!

37
magritte

Global.asax.csのクラスは Composition Root であるため、外部から何かを注入することはできません(また、注入すべきではありません)。

ただし、MvcApplicationクラスのインスタンスは1つしかないため、そのメソッドの1つにサービスが必要な場合は、メンバーフィールドとして宣言するだけです。例:

public class MvcApplication : System.Web.HttpApplication
{
    private readonly ILogService log;

    public MvcApplication()
    {
        this.log = new MyLogService();
    }

    protected void Application_Start()
    {
        // ...

        this.log.Log("Application started");
    }
}
38
Mark Seemann