輕量級、可擴展 DI 容器,支持構造函數/屬性/方法三種注入。本質是智能對象工廠+生命周期管理器,將「依賴誰」與「誰創建依賴」分離。適用可擴展/可插拔系統,簡單應用引入會增加複雜度,有微小性能開銷。
public interface IDialer { void Dial(string number); }
public abstract class Dialer : IDialer { public abstract void Dial(string number); }
public class ButtonDialer : Dialer { public override void Dial(string n) => Console.WriteLine("Button: " + n); }
public class PlateDialer : Dialer { public override void Dial(string n) => Console.WriteLine("Plate: " + n); }
public class Telephone {
public Dialer Dialer { get; set; } // 屬性注入點
public Telephone(IDialer dialer) { } // 構造函數注入點
public void Initialize(IDialer dialer) { } // 方法注入點
}
using Microsoft.Practices.Unity;
var container = new UnityContainer();
container.RegisterType<IDialer, ButtonDialer>(); // 接口映射
var phone = container.Resolve<Telephone>(); // 自動構造注入 IDialer
var container = new UnityContainer();
var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Configure(container); // 載入配置
var phone = container.Resolve<Telephone>(); // 同樣解析方式
Telephone 定義 public Telephone(IDialer dialer),容器 Resolve 時自動解析 IDialer 映射並調用構造函數。單構造函數零配置;多構造需 [InjectionConstructor] 指定。
public class Telephone {
[Dependency]
public Dialer Dialer { get; set; } // 標記抽象類類型屬性
}
配置補充 Dialer 映射:
構造函數可註釋,容器仍通過屬性注入完成依賴裝配。
public class Telephone {
[InjectionMethod]
public void Initialize(IDialer dialer) { /* 初始化邏輯 */ }
}
容器解析後自動調用 Initialize 並注入參數。構造函數與屬性標記可共存,按構造→屬性→方法順序執行。
Resolve 獲取對象,容器遞歸構建完整依賴圖掌握這三步,即擁有了在 .NET 應用中實施依賴注入的核心能力。