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>();
}
}
どんな助け/アドバイスも大歓迎です!
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");
}
}