17,EasyNetQ-替換EasyNetQ組件

EasyNetQ是一個由小型組件組成的庫。 當你寫:ide

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

...靜態方法CreateBus使用一個微小的內部IoC容器來組裝這些組件。 CreateBus方法的重載容許您訪問組件註冊,以便您能夠提供您本身的任何EasyNetQ依賴關係的版本。 簽名看起來像這樣:函數

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

IServiceRegister接口提供了一種方法:spa

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

所以,要基於IEasyNetQLogger註冊您本身的記錄器,您須要編寫如下代碼:code

IEasyNetQLogger logger = new MyLogger(); // note the use of IEasyNetQLogger not var.
var bus = RabbitHutch.CreateBus(connectionString, 
    serviceRegister => serviceRegister.Register(serviceProvider => logger));

Register方法的參數Func <IServiceProvider,TService>是一個函數,它在CreateBus將這些組件拉到一塊兒以生成一個IBus實例時運行。 IServiceProvider看起來像這樣:blog

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

這使您能夠訪問EasyNetQ提供的其餘服務。 例如,若是您想用您本身的ISerializer實現來替換默認的序列化程序,而且想要經過引用記錄器來構建它,則能夠這樣作:接口

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

請注意,咱們必須在Register方法上使用明確的類型參數,以便內部IoC容器知道咱們正在替換哪一個服務。string

要查看組成IBus實例的組件的完整列表,以及它們的組裝方式,請查看ComponentRegistration類。it

您能夠經過IAdvancedBus的Container屬性訪問容器。 這使您能夠訪問內部組件:io

var serializer = bus.Advanced.Container.Resolve<ISerializer>();

要用您本身選擇的IoC容器替換內部容器,請參閱使用替代DI容器class

相關文章
相關標籤/搜索