autofac文檔:服務類型,名稱和鍵


AutoFac文檔

目錄

  1. 開始
  2. Registering components
  3. 控制范圍和生命周期
  4. 用模塊結構化Autofac
  5. xml配置
  6. 與.net集成
  7. 深入理解Autofac
  8. 指導
  9. 關於
  10. 詞匯表

服務類型,名稱和鍵

同一個服務的不同實現可以以類型,名稱和鍵區分。

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的實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM