Unity Application Block 是微軟 Patterns & Practices 團隊產出的依賴注入容器,核心優勢:
// 接口映射
container.RegisterType<IMyService, CustomerService>();
// 基類映射
container.RegisterType<BasePlayer, Mp3Player>();
// 命名映射
container.RegisterType<IPlayer, Mp3Player>("MyMp3");
// 指定生命周期
container.RegisterType<IPlayer, Mp3Player>(new ContainerControlledLifetimeManager());
豐富重載支持:泛型/非泛型、命名/默認、生命周期/無。
var existing = new LoggingService();
container.RegisterInstance<IMyService>(existing); // 默認單例
container.RegisterInstance<IMyService>("Named", existing, new ExternallyControlledLifetimeManager());
public class CustomerService {
public CustomerService(LoggingService logger) {
logger.WriteToLog("Initialized");
}
}
// 容器自動解析 LoggingService 並注入
var svc = container.Resolve<CustomerService>();
public class ProductService {
private SupplierData _supplier;
[Dependency]
public SupplierData SupplierDetails {
get => _supplier;
set => _supplier = value;
}
}
// Resolve 時自動注入 SupplierData 實例
public class Mp3Player : IPlayer {
public Song CurrentSong { get; private set; }
[InjectionMethod]
public void Initialize(Song song) => CurrentSong = song;
// ...
}
| 特性 | 說明 |
|---|---|
| 對象組合引擎 | RegisterType/RegisterInstance + Resolve/ResolveAll 核心 API |
| IoC 核心 | 構造函數/屬性/方法注入,Attribute 或配置驅動 |
| 容器層級 | 父子容器繼承,解析向上委托 |
| 配置系統 | 標準 .NET config(XML)驅動註冊 |
| 零侵入選項 | 無需 Attribute 即可使用構造函數注入 |
| 擴展點 | 自定義 LifetimeManager、建構策略、攔截器 |
Unity 1.0 確立了微軟官方 DI 容器標準,後續版本持續增強攔截、配置、性能,核心哲學不變。