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。下节再讲