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