Наследование сообщений и получение доступа к сообщению от потребителя

Прежде всего, я знаю, что наследование не совсем хорошо, и мы должны быть осторожны с этим, но...

В системе у меня есть набор различных команд, которые я публикую на шину для запуска соответствующих служб. Теперь я хочу зарегистрировать тот факт, что некоторые сообщения (не все сообщения, только подмножество) были выпущены.

Я думал, что идеальным способом справиться с этим был бы какой-то отдельный сервис, который просто подписывался на список интересующих меня сообщений, ловил его и регистрировал.

Как лучше всего это реализовать?

Я думал об использовании наследования, как это

public interface IAction
{
}


public interface TestCommand : IAction
{
    Guid Id { get; }
    string Message { get; }
}


public class TestHandler : IConsumer<IAction>, IConsumer<TestCommand>
{
    public async Task Consume(ConsumeContext<IAction> context)
    {
        var action = context.Message;
    }

    public async Task Consume(ConsumeContext<TestCommand> context)
    {
        var cmd = context.Message;
    }
}

но проблема здесь в том, что IAction потребитель не имеет доступа ко всему сообщению, поэтому я просто не могу получить контент для регистрации.

Можно ли как-то решить эту проблему и получить доступ к содержанию сообщения? Или этот подход совершенно неверен, и я должен использовать что-то еще?

2 ответа

Решение

Ты можешь использовать context.TryGetPayload<YourMessageType>(out var message) но опять же вам нужно знать тип сообщения.

Вы также можете потреблять (или получать полезную нагрузку) JObject, который даст вам все в простом формате JSON.

Наблюдатели лучше для регистрации, проверьте функцию аудита, чтобы увидеть, как это можно сделать.

Вы должны переместить декларацию вашего

string Message { get; }

в

public interface IAction

Я имею в виду, что каждая команда будет иметь сообщение и идентификатор, верно?

Другие вопросы по тегам