autofac文档:服务类型,名称和键
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的實現。
轉載于:https://www.cnblogs.com/wolegequ/archive/2012/06/03/2532605.html
總結
以上是生活随笔為你收集整理的autofac文档:服务类型,名称和键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看懂此文 你离赚钱就不远了
- 下一篇: win7下编译uCOS-II