Autofacは静的メソッドのインタフェースオブジェクトを登録する方法

2325 ワード

タイトルは正確ではないかもしれませんが、私はどのように説明するか分かりません.知らない原因は、依存に対して一知半解を注入することである.
Autofacでは、オブジェクトインスタンスをインタフェースに自動的に登録できます.そしてasp.Netmvcでは,このインスタンス化作業は,通常,各コントローラの構造関数で行われる.
もし、私には静的な方法があるなら、これらのインタフェースを使わなければなりませんか?どのようにインスタンス化しますか?例:
public static bool SetData()
{
    //              ,  ILog
}

もちろん、このオブジェクトをパラメータとして渡すことができます.
public static bool SetData(Ilog log)

問題は、このインスタンス化オブジェクトを転送するのが不便な場合があります.なぜなら、この静的メソッドは多くの場所で使用されている可能性があります.このインスタンスオブジェクトを転送するには、多くの場所を変更する必要があります.各呼び出し元は、自分のコンストラクション関数にこのインタフェースをパラメータとして追加します(そうでなければ、どのように登録しますか?)
最良の方法は、この静的メソッドにインスタンスオブジェクトを登録または取得することです.
public static bool SetData()
{
    //          , 
    ILog log = ....
}

しかし、このインスタンスオブジェクトをどのように取得しますか?newが一つでautofacの強みはなくなります.Autofacを使い、IOCコンテナを使うのは、インタフェース向けにプログラミングするためです.設計段階からデッドオブジェクトのインスタンス化タイプを書くと,インタフェース向けプログラミングとは呼ばない.
では、どのようにインスタンス化しますか?
ソース紫:
public static bool SetData()
{
    //DependencyResolver System.MVC    
    //          ,           ,        
    //   ,  autofac        
    ILog log = DependencyResolver.Current.GetService<ILog>();
}

前提条件として、インスタンス化オブジェクトタイプは、ASPなどのプロジェクトの初期化段階で登録する.NET MVCプロジェクトのapp_startイベントに登録:
builder.RegisterType<MyLog>().As<ILog>().InstancePerLifetimeScope();

参考記事:[AutofacがASP.NET MVC 5クラスを注入する静的方法にどのように依存するか](http://www.lanhusoft.com/Article/366.html)