什麼是DI ?
一般我們再說DI 的時候會分為兩種不同的情境:
一種是Dependency Inversion(相依性反轉),通常在討論設計模型與相依性時使用.
此時關注點在於兩個模型之間的關係
另一種是Dependency Injection(相依性注入),通常會在討論如何實作時使用.
此時關注點在於如何實作Dependency Inversion
不過大致上來說概念與目的皆相同,所以不會再特別用其他名詞來區別
什麼是DI Container?
DI Container 是指用來提供Dependency Injection(相依性注入)的容器,容器內的結構基本上都是各種Class 的Constructor,並且在需要提供注入的地方建立Object , Ex:
public class DIContainer
{
private List<Type> objectFactory = new List<Type>();
public void Register(Type type)
=> objectFactory.Add(type);
public object Resolve(Type type)
=> objectFactory.ContainKey(type) ? CreateObject(type) : throw;
private object CreateObject(Type type)
=> Activator.CreateInstance(type);
}
var di = new DIContainer();
di.Register(typeof(Foo));
Foo foo = di.Resolve(typeof(Foo));
Bar bar = di.Resolve(typeof(Bar)); // throw error
利用這樣的一個基礎概念模型,我們可以得到任何我們註冊在DIContainer中的物件,進而利用DIContainer來將已完成的物件提供到指定的相依性關注點上,更多其他的DI Container衍生功能會在後續介紹
DI Container 用語
- Register : 註冊指定物件建構方式
- Resolve : 依照所註冊的建構方式建構指定物件
- Inject , Injector : 於關注點輸出建構好的物件
Lifetime : 物件的生命週期
Singleton:僅會在首次執行建構流程,之後都提供已建構完成的物件,並在Container Dispose時Dispose.
Scope:具有線生命週期的物件,具有IDisposable 特性,在完成一些任務後可讓其失效.
Transient:每一次的要求Container都會執行建構流程來建構全新的物件
所以然後哩!?
既然相依性問題已經能獲得妥善的處理,那勢必就會再繼續想這樣的模型還可以變出什麼樣的花樣,或帶給我們什麼樣的優勢
所以才會有個家DI Container爭霸的局勢.這部分就讓看倌們自行體驗吧.
所以現階段DI Container的目的早已不只適用於相依性問題或關注點分離,這是內建的
如同JS的3大SPA framework 解決SPA困境是內建的 最後則是看各家能變出什麼樣的花樣來讓使用者有更好的體驗