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