MassTransit 学习记录(杂项) IConsumer泛型实现和多继承

前面讲到过,MassTransit的消费三种方式,Consumer方式就是其中的一种,IConsumer<T>是该方式的约定接口。

一般来说,每个Exchange对应一个Consumer,即常规代码如下

    public class SomeConsumer : IConsumer<ClassA>
    {
        public Task Consume(ConsumeContext<ClassA> context)
        {
            throw new NotImplementedException();
        }
    }

当一个Consumer用于同一类消息(这类消息都有一个共同的基类)时,那么我们一般会通过泛型(继承)来实现Consumer

    public class GenericConsumer<T> : IConsumer<T>
        where T : class, ICommand//这里ICommand就是所有接收到的ExChange的基类,这里就不讨论广播或者发送时可以指定发送的是Exchange,实际是其它类型的消息
    {//所有消息都基于同一个基类时,可以通过泛型来实现Consumer
        public Task Consume(ConsumeContext<T> context)
        {
            //do some thing
            //以ICommand为基础做一些操作
            throw new NotImplementedException();
        }
    }

这时候你可以通过下面的代码来接收所有Exchange为ICommand的消息

                configure.ReceiveEndpoint(host, "allcommand", e =>
                {
                    e.Consumer(() => new GenericConsumer<ICommand>());//当然这么接收的前提是消息发送方均指定了Exchange为ICommand,比如rbBus.Publish<ICommand>(new { Value = text });
                });

这时候,还有一种情况,虽然不常见,但的确有的情况,那就是这些消息彼此之间没有任何关系,但他们都要做一些共同的事情,这时候泛型肯定是走不通(当然你说改代码让所有消息都继承同一个基类也可以,但这里不考虑这种方式),而第一种一个个声明的方式虽然能实现,但要写N个Consumer实现,接收部分也要写N个e.Consumer委托,这肯定不是个最好的实现,那么该如何做呢?好吧,多继承该登场了,相关代码如下

    public class CommonConsumer : IConsumer<ClassA>, IConsumer<ClassB>, IConsumer<Class1>
    {//ClassA和ClassB没有任何关系,他们仅仅是某些属性相同,这里假设他们都有Id和Value属性
        //Class1和ClassA、ClassB连属性名称都不一样
        public async Task Consume(ConsumeContext<ClassB> context)
        {
            await this.DoSomeThing(context.Message);
        }

        public async Task Consume(ConsumeContext<ClassA> context)
        {
            await this.DoSomeThing(context.Message);
        }

        public async Task Consume(ConsumeContext<Class1> context)
        {
            dynamic message = context.Message;//假设Class1并不具备id和value,它有的是cid和cvalue
            await this.DoSomeThing(new { Id = message.CId, Value = message.CValue });
        }
        private async Task DoSomeThing(dynamic message)
        {
            //do something
            //假定都有id,value属性,然后就可以通过DLR对message.Id和message.Value做一些处理
        }
    }

而接收代码也是简单的如下

                configure.ReceiveEndpoint(host, "allcommand", e =>
                {
                    e.Consumer(() => new CommonConsumer());
                });

注意这时消息发送方在进行消息推送时,还是按各自的Exchange进行推送,这与第二种的泛型Consumer不一样

时间: 2024-08-29 22:55:28

MassTransit 学习记录(杂项) IConsumer泛型实现和多继承的相关文章

C#学习记录3下——类的封装,继承,多态

new,virtual,override三者的区别 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Example 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 Shape sh

Spring学习记录(四)---bean之间的关系:继承、依赖

     继承 这里说的继承和java的继承是不一样的,不是父类子类.但思想很相似,是父bean和子bean 1.父bean是一个实例时.它本身是一个完整的bean 2.父bean是模板,抽象bean,不能被实例化,只是来被继承. 当遇到一个类要实例化出很多相似的bean对象时,如下,看起来是不是很不简洁 1 <bean id="address1" class="com.guigu.spring.autowire.Address" 2 p:city="

C#学习记录3上——类的封装,继承,多态

OOP面向对象的三大特点:封装(encapsulation),继承(inheritance),多态(encapsulation) 和JAVA与C++一样,C#也是OOP语言.并且,C#对数据的封装要比C++更好.另外,在C++里面可能习惯从main函数开始程序,类是作为主函数的一部分而存在的.而C#里面,所有的所有都是在某个类中进行. 这里还是说C#较其他语言不一样的地方. 有关类Class 1.方法参数Arguments和传递参数Parameters 首先说一下这两个词的区别.其实都是指参数,

Java学习记录(补充三:面向对象的封装和继承)

面向对象的封装package day7; //面向对象的封装 public class Employee { String name = "zhangsan"; private int age; //多个方法重载 public Employee(){ } public Employee(String name,int age){ } public Employee(int age,String name){ } //可以在方法里修改不能访问的属性 public int getAge()

《C++11/14高级编程Boost程序库探秘》之第1章全新的C++语言(三)学习记录

<C++11/14高级编程Boost程序库探秘>之第1章全新的C++语言(三)学习记录 1.7函数式编程 函数式编程是与面向过程编程.面向对象编程和泛型编程并列的一种编程范式,它基于λ演算理论,把计算过程视为数学函数的组合运算. 1.7.1 lambda表达式 基本形式为: [](params){...} []称为lambda表达式引出操作符,圆括号里是函数的参数,花括号内则是函数体,可以使用任何C++语句. lambda表达式的类型称为闭包,无法直接写出,所以通常需要使用auto的类型推导功

Python学习记录-2016-12-17

今日学习记录 模块: import os#导入os模块 import sys#导入sys模块 os.system("df -h")#执行df -h命令 cmd_res = os.popen("df -h").read()#将命令的返回结果赋值给cmd_res,如果不加入.read()会显示命令的返回加过在内存的位置 print(sys.path)#显示系统变量路径,一般个人模块位于site-packages下,系统模块位于lib下 print(sys.argu[2]

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,