AutoFac文檔
目錄
- 開始
- Registering components
- 控制范圍和生命周期
- 用模塊結構化Autofac
- xml配置
- 與.net集成
- 深入理解Autofac
- 指導
- 關於
- 詞匯表
服務類型,名稱和鍵
同一個服務的不同實現可以以類型,名稱和鍵區分。
autofac提供三種典型的方式區分服務。
按類型
類型是描述服務的基本方法
builder.Register<OnlineState>().As<IDeviceState>();
這個例子將IDeviceState 類型的服務和OnlineState 的component聯系起來。可以用這個服務的類型來檢索OnlineState的實例:
var r = container.Resolve<IDeviceState>();
指定類型的服務在自動裝配中也會起作用。
按名字
服務可以進一步按名字識別。使用這種技術時,用 Named()注冊方法代替As():
builder.Register<OnlineState>().Named<IDeviceState>("online");
使用 ResolveNamed()檢索指定名字的服務:
var r = container.ResolveNamed<IDeviceState>("online");
在之前的2.3版本中,ResolveNamed()只是Resolve()的簡單重載。
指定名字的服務其實是指定鍵的服務的簡單版本,所以在下一節講到的技術也同樣適用於指定名字的服務。
按鍵
在一些情況下使用字符串做component的名字很方便,但是在另外一些情況下我們需要使用其他類型做鍵。按鍵指定服務提供了這種機制。
比如,使用一個枚舉來描述設備的不同狀態
public enum DeviceState { Online, Offline }
每個枚舉值對應一個服務的實現。
public class OnlineState : IDeviceState { }
可以像下面這樣使用枚舉值來做鍵
var builder = new ContainerBuilder(); builder.RegisterType<OnlineState>().Keyed<IDeviceState>(DeviceState.Online); builder.RegisterType<OfflineState>().Keyed<IDeviceState>(DeviceState.Offline); // Register other components here
顯式檢索
可以使用ResolveKeye()進行顯式檢索。
var r = container.ResolveKeyed<IDeviceState>(DeviceState.Online);
這么做導致容器被當做 Service Locator使用,這是不被推薦的。應該使用IIndex type替代。
在之前的2.3版本中, ResolveKeyed()只是Resolve()的簡單重載。
使用索引檢索
Autofac.Features.Indexed.IIndex<K,V>是autofac自動實現的一個關聯類型。component可以使用IIndex<K,V>作為參數的構造函數從基於鍵的服務中選擇需要的實現。
public class Modem : IHardwareDevice { IIndex<DeviceState, IDeviceState> _states; IDeviceState _currentState; public Modem(IIndex<DeviceState, IDeviceState> states) { _states = states; SwitchOn(); } void SwitchOn() { _currentState = _states[DeviceState.Online]; } }
在SwitchOn方法中。使用索引從前面用DeviceState.Online做鍵注冊的IDeviceState的實現。