在物件導向設計原則,有一項是「相依注入」,描述著若物件有強耦合的相依性,要想減少此特性,
其中有三種注入方式:建構式、屬性及方法;若要極致解耦合,就要將這層耦合關係轉到第三方身上,
這叫「控制反轉」,而這第三方的東西就發展出來就稱為Ioc framework。
這邊就來用用看 Autofac (Spring.NET 也是不錯的選擇),搭配官網教材服用。
接著試著基本操作,大概保守幾個原則
- 建立容器Builder
- 註冊物件到Builder(e.g. RegisterType<>)
- 呼叫Build 方法取得容器
- 透過容器叫用物件並呼叫方法(e.g. Resolve<>)
我們設計相關寫Log程式來模擬好了,其中會有 LogService,ILogger,NLog,Log4Net,
其中 ILoger 會被後兩者實作,程式碼如下
ILogger
Nlog與Log4Net (兩者都實作 ILogger)
LogServcie
client 端叫用,其中 LogService 建構式指定傳入 NLog,呼叫 write 輸出 nlog...
以上是一般呼叫,接著來使用容器...
依照一開始說明的步驟,大概有4個部分,其中我們是個別註冊型別Service及Logger,而且此次註冊的是
Log4Net 型別與第一次區別,最後使用 Resolve 取得實體物件,並且呼叫 Write 方法。
其中可以發現在 Service 內部中,相關的對應設定,其實沒有處理,應該是容器幫我們做掉了。
再來改寫一下,將註冊物件與實際執行呼叫拆兩個方法 RegisteringComponents、WritingLog,
並且提升 container 為欄位
client 端改呼叫這兩個方法,如下圖,還是得到一樣的結果。
以上有沒有越來越解耦合的。
另外,有沒有直接註冊組件裡面所有的物件及介面方式,直接改 RegisteringComponents 方法,希望註冊名稱
後綴詞為 Service 結尾以及實做 ILogger 介面的物件,其 WritingLog 方法內容物不變,同樣還是會得到解答
其中,需要注意的是,這次NLog與 Log4Net 都有註冊,那為何 LogService Write 出來,會是 Nlog 呢?
主要是註冊順序是後面的會被當作預設物件,順序是英文排序。
下回來看看注入的生命週期
沒有留言:
張貼留言