PublishRequest<T> v5.x 中等效的 IBus 扩展

PublishRequest<T> IBus extension equivalent in v5.x

从 IBus 接口中删除了 v5 PublishRequest 扩展。

我们使用回调来处理可以从消费者返回的多种响应类型(故障、验证、实际响应等)

发布消息和连接多种响应类型的等效方法是什么?

// Request/Response contracts, may also return validation failure or fault contract
Request<TMessage> request = await bus.PublishRequest<TMessage>( msg, context => {
    context.Handle<TResponse>( value => ... );
    context.Handle<TValidation>( value => ... );
    context.Handle<Fault>( value => ... );

    context.CorrelationId = ...
    context.Headers.Set( ... );
});

await request.Task;

您可以使用新语法,整体上更简洁。

var client = Bus.CreateRequestClient<RegisterMember>();

var (registered, existing) = 
    await client.GetResponse<MemberRegistered, ExistingMemberFound>(
        new RegisterMember() {MemberId = "Johnny5"});

这将 return 两个响应中的任何一个,如果发生错误,任何一个都会抛出错误的请求异常。

您还可以使用请求句柄添加 headers 等

var client = Bus.CreateRequestClient<RegisterMember>();

var request = client.Create(new RegisterMember()
    {MemberId = "Johnny5"});

// the request is also the send pipe configurator, so...
request.UseExecute(context => context.CorrelationId = someId);

var (registered, existing) = 
    await request.GetResponse<MemberRegistered, ExistingMemberFound>();

您可以在以后的测试中看到一个有效的测试用例:

https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit.Futures.Tests/Request_Specs.cs#L170