依賴註入的基礎 我們都知道DI,,他是一種開發模式。他是將服務可被應用程式任何位置的代碼使用,當某個代碼組件(如一個類)需要引用某些外部代碼(一個服務)時。都有兩種選擇 1:直接在調用代碼種創建服務組件的一個新實例。 2:收到該服務的一個有效實例。 比如一個操作是記錄操作記錄。那麼看以下代碼。業務邏 ...
依賴註入的基礎
我們都知道DI,,他是一種開發模式。他是將服務可被應用程式任何位置的代碼使用,當某個代碼組件(如一個類)需要引用某些外部代碼(一個服務)時。都有兩種選擇
1:直接在調用代碼種創建服務組件的一個新實例。
2:收到該服務的一個有效實例。
比如一個操作是記錄操作記錄。那麼看以下代碼。業務邏輯和記錄操作緊密耦合
public void Home() { var log=new Logger(); log.Log("Waring"); }
如果該類移動到其他位置,那麼必須也要移動所有引用和依賴,如果有資料庫操作。那麼使用的地方都要有資料庫連接,
如果解耦
private readonly ILogger _logger; public HomeController(ILogger logger) { _logger = logger; } public void Home() { var log=new Logger(); log.Log("Waring"); }
將其抽象為ILogger 介面,通過構造函數註入。
當然如果過度使用依賴註入,那麼會有這樣。依賴的有其他的依賴。以此類推。
可以使用DI框架。同時也叫IOC框架
var logger=SomeFrameworkIoC.Resolve(typeof(ILogger));
Service Locator模式
松耦合調用外部依賴,並非只有依賴註入。還有Service Locator。它能夠創建與指定抽象類型匹配的實例。DI和它的關鍵區別在於,DI要求相應地設計外圍代碼;構造方法與其他方法的簽名可能會發生變化。而它保守。 可讀性差一點。當龐大的現有代碼庫種重構依賴時,它是一個理想選擇。
如下:
public void Perform() { var logger=HttpContext.RequestService.GetService<ILogger>(); }
這是RequestService對象在HTTP上下文中扮演了Service Locator角色。
當然依賴註入的生命周期。大家想必都有所瞭解。我這裡簡單說一下