zoukankan      html  css  js  c++  java
  • EasyNetQ笔记-替换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>();
    
  • 相关阅读:
    Swift -- 8.3 多态
    Swift -- 8.2 类的构造与析构
    Swift -- 8.1 继承
    Swift -- 7.6 构造器
    Swift -- 7.5 类型属性,方法
    Swift -- 7.4 方法,下标,可选链
    Swift -- 7.3 类和结构体
    Swift -- 7.2 枚举
    Swift -- 7.1 面向对象简介
    4-5轮选区的不透明度1.7
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13622396.html
Copyright © 2011-2022 走看看