Rebus Pub Sub: получение заголовков на подписчике - PullRequest
1 голос
/ 30 мая 2019

Заголовки публикуются с помощью служебной шины Azure, как показано ниже:

 string content = "body";
 await _busPublisher.Activator.Bus.Publish(content, headers);

Как получить заголовок и содержимое на подписчике?

class Handler :  IHandleMessages<string>
    {

    public Handler(IMessageContext messageContext, ILog log)
    {
        _messageContext = messageContext;
        _log = log;
    }

        public async Task Handle(string message)
        {
            Console.WriteLine("Handle(string message): {0}", message);

        }
    }

Обновление

Ниже приведено одно решение.Это лучшее решение?

        public Handler(IMessageContext messageContext, ILog log)
    {
        _messageContext = messageContext;
        _log = log;
    }
            public async Task Handle(string message)
            {
                Console.WriteLine("Handle(string message): {0} ", message);
                Console.WriteLine("headers: {0} ", string.Join(' ', _messageContext.Headers));

            }

Когда создается экземпляр обработчика, как показано ниже, можно ли вместо этого использовать внедрение зависимостей?

        var Activator = new BuiltinHandlerActivator();

        Activator.Register((mc) =>
            {
                return new Handler(mc, log);  //no new?

            }

1 Ответ

1 голос
/ 30 мая 2019

Принято IMessageContext Внедрено в конструктор вашего обработчика - вот путь:

public class Handler : IHandleMessages<string>
{
    readonly IMessageContext messageContext;

    public Handler(IMessageContext messageContext, ILog log)
    {
        this.messageContext = messageContext;
    }

    public async Task Handle(string message)
    {
        var headers = messageContext.Headers;

        // do stuff
    }
}

Если вы используете BuiltinHandlerActivator, вы можете сделать это так:

activator.Register(context => new Handler(context));

или если вам также нужен IBus в вашем обработчике:

activator.Register((bus, context) => new Handler(bus, context));
...