Наследование сообщений и получение доступа к сообщению от потребителя
Прежде всего, я знаю, что наследование не совсем хорошо, и мы должны быть осторожны с этим, но...
В системе у меня есть набор различных команд, которые я публикую на шину для запуска соответствующих служб. Теперь я хочу зарегистрировать тот факт, что некоторые сообщения (не все сообщения, только подмножество) были выпущены.
Я думал, что идеальным способом справиться с этим был бы какой-то отдельный сервис, который просто подписывался на список интересующих меня сообщений, ловил его и регистрировал.
Как лучше всего это реализовать?
Я думал об использовании наследования, как это
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
Я имею в виду, что каждая команда будет иметь сообщение и идентификатор, верно?