25、Replacing EasyNetQ Components 替换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>();

要用您自己的IoC容器来替换内部容器,请看Using Alternative DI Containers。下节再讲

 

posted on 2017-12-08 10:11  困兽斗  阅读(284)  评论(0编辑  收藏  举报

导航