Masstransit 有没有一种方法可以让消息作为类发送,并在该类实现的每个接口上使用?
假设我有一个C类,它实现了接口I1和I2Masstransit 有没有一种方法可以让消息作为类发送,并在该类实现的每个接口上使用?,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
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