天天看點

autofac如何注冊靜态方法裡的接口對象

标題可能是不準确的,因為我不知道如何描述。不知道的原因,是對依賴注入一知半解。

Autofac可以自動注冊對象執行個體到接口,人所盡知。而在asp.net mvc中,這個執行個體化的工作,通常在每個控制器的構造函數裡完成。

假如,我有些靜态方法裡,非要用到這些接口呢?怎麼執行個體化它們?例如:

public static bool SetData()
{
    //這裡需要用到執行個體化的某個對象,例如ILog      

你當然可以将這個對象作為參數傳遞進來,如

public static bool SetData(Ilog log)      

問題是,有時候并不友善将這個執行個體化對象傳進來,原因可能是這個靜态方法很多地方都在使用,要傳這個執行個體對象,需要改好多地方;并且每個調用方,都要在自己的構造函數裡加入這個接口作為參數(不然咋注冊?)

最好的辦法就是在這個靜态方法裡注冊或獲得執行個體對象

public static bool SetData()
{
    //在這裡獲得執行個體化對象,如      

但如何擷取這個執行個體對象呢?new一個的話,autofac的優勢就蕩然無存了。之是以使用autofac,使用IOC容器,就是為了面向接口程式設計。如果從設計階段就寫死對象的執行個體化類型,就不叫面向接口程式設計了。

那麼,如何執行個體化?

可以醬紫:

public static bool SetData()
{
    //DependencyResolver是System.MVC裡的對象
    //下面這個表達式大意是,獲得現行注冊的對象類型,來執行個體化接口對象
    //換言之,這是autofac的手動執行個體化方式      
builder.RegisterType<MyLog>().As<ILog>().InstancePerLifetimeScope();      

繼續閱讀