1. 程式人生 > 實用技巧 >EasyNetQ筆記-替換EasyNetQ元件

EasyNetQ筆記-替換EasyNetQ元件

EasyNetQ是一個由小元件組成的庫。當你寫如下程式碼:

var bus = RabbitHutch.CreateBus("host=localhost");

靜態方法CreateBus通過IoC容器組裝這些元件,CreateBus的一個過載允許你訪問元件註冊,這樣您就可以提供您自己版本的EasyNetQ依賴項。過載方法原型如下:

public static IBus CreateBus(string connectionString, Action<IServiceRegister> registerServices)

IServiceRegister介面聲明瞭一個方法:

public interface IServiceRegister
{
    IServiceRegister Register<TService>(Func<IServiceProvider, TService> serviceCreator) where TService : class;
}

因此,要註冊你自己實現IEasyNetQLogger介面的日誌例項,您需要編寫以下程式碼:

IEasyNetQLogger logger = new MyLogger(); // 注意要使用IEasyNetQLogger而不是var。
var bus = RabbitHutch.CreateBus(connectionString, 
    serviceRegister => serviceRegister.Register(serviceProvider => logger));

Register方法的引數即Func<IServiceProvider, TService>委託,當CreateBus將元件組合在一起時,該委託方法將建立一個IBus例項。IServiceProvider宣告如下:

public interface IServiceProvider
{
    TService Resolve<TService>() where TService : class;
}

這允許你訪問EasyNetQ提供的其他服務。

例如,如果您想用自己的ISerializer實現來替換預設的序列化器,並且您想用logger的引用來構造序列化器,那麼您可以這樣做:

var bus = RabbitHutch.CreateBus(connectionString, 
    serviceRegister => serviceRegister.Register<ISerializer>(
      serviceProvider => new MySerializer(serviceProvider.Resolve<IEasyNetQLogger>())));

注意,此處我們必須在Register方法上顯式指定型別引數,以便內部IoC容器知道我們要替換的服務。

要檢視組成IBus例項的元件的完整列表,以及它們是如何組裝的,請看一下元件註冊 ComponentRegistration類。

您可以通過IAdvancedBus的Container屬性訪問容器。比如從容器中獲取你註冊的元件:

//拿出註冊的ISerializer服務例項
var serializer = bus.Advanced.Container.Resolve<ISerializer>();