• 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>();
    
  • 相关阅读:
    1分钟解决VS每次运行都显示“正在还原nuget程序包”问题
    C#多线程和异步(一)——基本概念和使用方法
    owin使用
    使用DotNetOpenAuth搭建OAuth2.0授权框架
    DotNetOpenAuth实践之搭建验证服务器
    DotNetOpenAuth实践系列
    Android使用zxing生成二维码
    漂亮的Android表格框架
    Android控件七:视图-图片-文字切换器ViewAnimator
    Android学习随笔--ListView的分页功能
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13622396.html
Copyright © 2020-2023  润新知