2011-10-13 21 views
31

global.asax.csに依存関係を挿入するにはどうすればいいですか?つまり、MvcApplicationクラスですか?global.asax.csへの依存関係注入方法

以前は依存関係注入のためにサービスロケータ(反)パターンを使用していましたが、IOCコンテナを使用して最新のMVCアプリケーションのベストプラクティスのアドバイスを実行しようとしています(Unity.Mvc3 IDependencyResolverをそのまま使用)とコンストラクタインジェクション。

これまでのところ、いくつかのスラッグを除いてすべてがまっすぐに見えますが、そのうちの1つはglobal.asax.csにあります(もう1つはカスタム属性ですが、それをカバーするSOLに関する質問があります)。など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>(); 
    } 
} 

ご協力いただきありがとうございます。

+0

こんにちは、興味深い質問:例えば -

しかし、MvcApplicationクラスのインスタンスは1つだけですので、あなたはその方法の一つでサービスが必要な場合は、あなただけのメンバーフィールドとしてそれを宣言することができます! OnApplicationStartedのglobal.asax内に依存関係を挿入できないのはなぜですか?アプリケーションが起動できない場合は、何も動作しないので、あなたはそれに気づくでしょう... –

答えて

31

あなたのglobal.asax.csのクラスはComposition Rootなので、外部から何も注入することはできません。

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"); 
    } 
} 
+5

+1 Composition Root blog。素晴らしいもの! –

+1

クイック返信マークありがとう。どのように単体テストをテストするのですか? ILogService? – magritte

+4

私はしません。 Composition Rootは、謙虚なオブジェクトの例です(http://xunitpatterns.com/Humble%20Object.html)。複雑なロジックを呼び出す必要がある場合は、単体テストできる別のクラスに委譲することができます。 –