autofac文档:服务类型,名称和键
AutoFac文檔
目錄
服務(wù)類型,名稱和鍵
同一個服務(wù)的不同實現(xiàn)可以以類型,名稱和鍵區(qū)分。
autofac提供三種典型的方式區(qū)分服務(wù)。
按類型
類型是描述服務(wù)的基本方法
builder.Register<OnlineState>().As<IDeviceState>();這個例子將IDeviceState 類型的服務(wù)和OnlineState 的component聯(lián)系起來??梢杂眠@個服務(wù)的類型來檢索OnlineState的實例:
var r = container.Resolve<IDeviceState>();指定類型的服務(wù)在自動裝配中也會起作用。
按名字
服務(wù)可以進一步按名字識別。使用這種技術(shù)時,用 Named()注冊方法代替As():
builder.Register<OnlineState>().Named<IDeviceState>("online");使用 ResolveNamed()檢索指定名字的服務(wù):
var r = container.ResolveNamed<IDeviceState>("online");在之前的2.3版本中,ResolveNamed()只是Resolve()的簡單重載。
指定名字的服務(wù)其實是指定鍵的服務(wù)的簡單版本,所以在下一節(jié)講到的技術(shù)也同樣適用于指定名字的服務(wù)。
按鍵
在一些情況下使用字符串做component的名字很方便,但是在另外一些情況下我們需要使用其他類型做鍵。按鍵指定服務(wù)提供了這種機制。
比如,使用一個枚舉來描述設(shè)備的不同狀態(tài)
public enum DeviceState { Online, Offline }每個枚舉值對應(yīng)一個服務(wù)的實現(xiàn)。
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);這么做導(dǎo)致容器被當做 Service Locator使用,這是不被推薦的。應(yīng)該使用IIndex type替代。
在之前的2.3版本中, ResolveKeyed()只是Resolve()的簡單重載。
使用索引檢索
Autofac.Features.Indexed.IIndex<K,V>是autofac自動實現(xiàn)的一個關(guān)聯(lián)類型。component可以使用IIndex<K,V>作為參數(shù)的構(gòu)造函數(shù)從基于鍵的服務(wù)中選擇需要的實現(xiàn)。
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的實現(xiàn)。
轉(zhuǎn)載于:https://www.cnblogs.com/wolegequ/archive/2012/06/03/2532605.html
總結(jié)
以上是生活随笔為你收集整理的autofac文档:服务类型,名称和键的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看懂此文 你离赚钱就不远了
- 下一篇: win7下编译uCOS-II