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>();
    
  • 相关阅读:
    诚聘Python等课程兼职讲师
    Ogre3d
    OGRE中 场景管理器,场景节点和实体
    第四天:原型模式建造者模式
    第二天:装饰模式及面向对象设计原则4则
    表达式求值:面向对象版本
    第五天:模板方法外观模式观察者模式
    第三天:代理模式工厂方法抽象工厂
    第一天:简单工厂与策略模式
    idea files count
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13622396.html
Copyright © 2011-2022 走看看