Masstransit 有没有一种方法可以让消息作为类发送,并在该类实现的每个接口上使用?

Masstransit 有没有一种方法可以让消息作为类发送,并在该类实现的每个接口上使用?,masstransit,Masstransit,假设我有一个C类,它实现了接口I1和I2 namespace Contract { public class C :I1,I2 { } public interface I1 { } public interface I2 { } } 所以,在我的制作人的某个地方,我将发布C: ... var message c = new C(); await _busControl.Publish(c); ... 在我的I1消费者中,我希望: cf

假设我有一个C类,它实现了接口I1和I2

namespace Contract
{
    public class C :I1,I2
    {
    }
    public interface I1 { }
    public interface I2 { }
}
所以,在我的制作人的某个地方,我将发布C:

...
var message c = new C();
await _busControl.Publish(c);
...
在我的I1消费者中,我希望:

        cfg.Host("localhost", "/");

        cfg.ConfigureMessageTopology();

        cfg.ReceiveEndpoint("subs", endpoint =>
        {
            endpoint.Durable = false;
            endpoint.Handler<I1>(context =>
            {
               ...
            });
          };
         cfg.Host("localhost", "/");

        cfg.ConfigureMessageTopology();

        cfg.ReceiveEndpoint("subs", endpoint =>
        {
            endpoint.Durable = false;
            endpoint.Handler<I2>(context =>
            {
               ...
            });
          };
在我的I2消费者中,我希望:

        cfg.Host("localhost", "/");

        cfg.ConfigureMessageTopology();

        cfg.ReceiveEndpoint("subs", endpoint =>
        {
            endpoint.Durable = false;
            endpoint.Handler<I1>(context =>
            {
               ...
            });
          };
         cfg.Host("localhost", "/");

        cfg.ConfigureMessageTopology();

        cfg.ReceiveEndpoint("subs", endpoint =>
        {
            endpoint.Durable = false;
            endpoint.Handler<I2>(context =>
            {
               ...
            });
          };
是否可以使用现有代码配置这样的路由? 如果不是,这是一个正确的方法吗?
如果我想实现这一点,建议采用什么方法?

它的工作原理是这样的。你不需要做任何事情来让它工作

如果使用返回接口的函数创建消息,则可能会遇到麻烦的唯一情况。由于MassTransit将使用通用重载发布,因此它将仅使用接口。在这种情况下,你可以说:

object message = MyMessageFactory();
await bus.Publish(message);
MassTransit会找出类型


但是,在您的场景中,它同样有效。

它是这样开箱即用的。你不需要做任何事情来让它工作

如果使用返回接口的函数创建消息,则可能会遇到麻烦的唯一情况。由于MassTransit将使用通用重载发布,因此它将仅使用接口。在这种情况下,你可以说:

object message = MyMessageFactory();
await bus.Publish(message);
MassTransit会找出类型


但是,在您的场景中,它仍然可以正常工作。

默认情况下使用RabbitMQ和Azure服务总线工作

它不适用于AmazonSQS或ActiveMQ

MassTransit将其称为多态消息路由,您可以在中看到拓扑的配置方式

要清理您的示例,您只需要以下内容:

namespace Contract
{
    public class C :
        I1,I2
    {
    }
    public interface I1 { }
    public interface I2 { }
}
然后发布:

var message c = new C();
await _busControl.Publish(c);
第一消费者:

class OneConsumer :
    IConsumer<I1>
{
    public async Task Consume(ConsumeContext<I1> context)
    {
    ...
    }
}

cfg.ReceiveEndpoint("one", endpoint =>
{
    endpoint.Durable = false;
    endpoint.Consumer<OneConsumer>();
};
class TwoConsumer :
    IConsumer<I2>
{
    public async Task Consume(ConsumeContext<I2> context)
    {
    ...
    }
}

cfg.ReceiveEndpoint("two", endpoint =>
{
    endpoint.Consumer<TwoConsumer>();
};
第二消费者:

class OneConsumer :
    IConsumer<I1>
{
    public async Task Consume(ConsumeContext<I1> context)
    {
    ...
    }
}

cfg.ReceiveEndpoint("one", endpoint =>
{
    endpoint.Durable = false;
    endpoint.Consumer<OneConsumer>();
};
class TwoConsumer :
    IConsumer<I2>
{
    public async Task Consume(ConsumeContext<I2> context)
    {
    ...
    }
}

cfg.ReceiveEndpoint("two", endpoint =>
{
    endpoint.Consumer<TwoConsumer>();
};

默认情况下,它使用RabbitMQ和Azure服务总线工作

它不适用于AmazonSQS或ActiveMQ

MassTransit将其称为多态消息路由,您可以在中看到拓扑的配置方式

要清理您的示例,您只需要以下内容:

namespace Contract
{
    public class C :
        I1,I2
    {
    }
    public interface I1 { }
    public interface I2 { }
}
然后发布:

var message c = new C();
await _busControl.Publish(c);
第一消费者:

class OneConsumer :
    IConsumer<I1>
{
    public async Task Consume(ConsumeContext<I1> context)
    {
    ...
    }
}

cfg.ReceiveEndpoint("one", endpoint =>
{
    endpoint.Durable = false;
    endpoint.Consumer<OneConsumer>();
};
class TwoConsumer :
    IConsumer<I2>
{
    public async Task Consume(ConsumeContext<I2> context)
    {
    ...
    }
}

cfg.ReceiveEndpoint("two", endpoint =>
{
    endpoint.Consumer<TwoConsumer>();
};
第二消费者:

class OneConsumer :
    IConsumer<I1>
{
    public async Task Consume(ConsumeContext<I1> context)
    {
    ...
    }
}

cfg.ReceiveEndpoint("one", endpoint =>
{
    endpoint.Durable = false;
    endpoint.Consumer<OneConsumer>();
};
class TwoConsumer :
    IConsumer<I2>
{
    public async Task Consume(ConsumeContext<I2> context)
    {
    ...
    }
}

cfg.ReceiveEndpoint("two", endpoint =>
{
    endpoint.Consumer<TwoConsumer>();
};

太好了,让我试试…太好了,让我试试…Tx给小费,AlexeyTx给小费,Alexey