标題可能是不準确的,因為我不知道如何描述。不知道的原因,是對依賴注入一知半解。
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();