Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时为Rebus生成消息处理程序_C#_Rabbitmq_Rebus - Fatal编程技术网

C# 在运行时为Rebus生成消息处理程序

C# 在运行时为Rebus生成消息处理程序,c#,rabbitmq,rebus,C#,Rabbitmq,Rebus,我面临一个问题,我想使用Rebus订阅和处理rabbitmq中的消息。在第三方程序集中定义了多种消息类型,新的消息类型将定期添加到该程序集中 我需要以某种方式使Rebus订阅和处理所有这些消息类型,并将它们转发(发布)到另一个rabbitmq实例。我的服务本质上是转发消息,并在这样做时添加自定义rebus头 问题是我不想为每种消息类型生成处理程序类(因为无论消息类型如何,功能都是相同的)。我也不想每次在第三方程序集中添加新的消息类型时都更新代码(编写新的处理程序类) 我尝试使用TypeBuild

我面临一个问题,我想使用Rebus订阅和处理rabbitmq中的消息。在第三方程序集中定义了多种消息类型,新的消息类型将定期添加到该程序集中

我需要以某种方式使Rebus订阅和处理所有这些消息类型,并将它们转发(发布)到另一个rabbitmq实例。我的服务本质上是转发消息,并在这样做时添加自定义rebus头

问题是我不想为每种消息类型生成处理程序类(因为无论消息类型如何,功能都是相同的)。我也不想每次在第三方程序集中添加新的消息类型时都更新代码(编写新的处理程序类)

我尝试使用TypeBuilder为反射找到的每种类型动态创建消息处理程序类,但感觉有点混乱,所以我希望有另一种方法

下面的代码概述了我希望实现的目标,即使代码没有编译

public void SubscribeAndHandleMessages()
        {
            // These types will be determined runtime by using reflection but thats omitted for clarity
            var messageTypes = new List<Type>(){typeof(MessageA), typeof(MessageB)}; 

            var activator = new BuiltinHandlerActivator();

            Configure.With(activator)
                .Transport(t => t.UseRabbitMq(_rabbitConnectionString, "MyQueue"))
                .Start();

            //Subscribe and register handlers
            foreach (var type in messageTypes)
            {
                activator.Bus.Subscribe(type); //This works, I can see the queue subscribing to the correct topics
                activator.Handle<type>(async (bus, context, message) => //This doesnt work since type is not known at compile time
                {
                    //Forwarding to another rabbit instance, same handling for all types of messages
                });
            }
        }
public void SubscribeAndHandleMessages()
{
//这些类型将通过使用反射在运行时确定,但为了清楚起见,省略了反射
var messageTypes=new List(){typeof(MessageA),typeof(MessageB)};
var activator=新的内置HandlerActivator();
使用(激活器)配置
.Transport(t=>t.UseRabbitMq(\u rabbitConnectionString,“MyQueue”))
.Start();
//订阅和注册处理程序
foreach(messageTypes中的变量类型)
{
activator.Bus.Subscribe(type);//这样做有效,我可以看到队列订阅正确的主题
activator.Handle(异步(总线、上下文、消息)=>//这不起作用,因为编译时类型未知
{
//转发到另一个rabbit实例,对所有类型的消息进行相同的处理
});
}
}

一旦建立了必要的订阅,您只需要能够处理收到的各种消息

使用Rebus实现这一点的最佳方法是避免普通的消息处理管道(反序列化=>查找处理程序=>分派),而是以原始形式(即“传输消息”形式)处理消息

您可以通过Rebus的传输消息转发功能实现这一点。使用它,100%通用消息处理程序可以如下所示:

Configure.With(激活器)
.Transport(t=>t.useinmemoryttransport(新的InMemNetwork(),“路由器tjek”))
.Routing(r=>r.AddTransportMessageForwarder(异步transportMessage=>
{
var headers=transportMessage.headers;//
您可以在此处阅读更多信息: