17,EasyNetQ-替换EasyNetQ组件

时间:2022-10-28 08:55:09

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(); // note the use of IEasyNetQLogger not 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实现来替换默认的序列化程序,并且想要通过引用记录器来构建它,则可以这样做:

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

请注意,我们必须在Register方法上使用明确的类型参数,以便内部IoC容器知道我们正在替换哪个服务。

要查看组成IBus实例的组件的完整列表,以及它们的组装方式,请查看ComponentRegistration类。

您可以通过IAdvancedBus的Container属性访问容器。 这使您可以访问内部组件:

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

要用您自己选择的IoC容器替换内部容器,请参阅使用替代DI容器