消息继承和从消费者获取消息

Message inheritance and getting access to the message from consumer

首先,我知道 inheritance is not quite good and we should be careful with it,但是...

在一个系统中,我有一组不同的命令,我发布到总线以触发适当的服务。现在我想记录一些消息(不是所有消息,只是一个子集)被发出的事实。

我当时认为处理它的理想方式是一些单独的服务,它只订阅我感兴趣的消息列表,捕获它并记录它。

实现它的最佳方法是什么?

我正在考虑像这样使用继承

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 消费者无法访问整个消息,所以我无法获取要记录的内容。

是否有可能以某种方式解决此问题并访问消息内容?或者,这种方法是完全错误的,我应该使用其他方法?

您应该移动

的声明
string Message { get; }

public interface IAction

我的意思是,每个命令都会有一个 Message 和一个 Id,对吗?

您可以使用 context.TryGetPayload<YourMessageType>(out var message),但同样您需要知道消息类型。

您还可以使用 JObject(或获取其有效负载),这将以 JSON.

的形式为您提供所有内容

Observers 更适合日志记录,检查审计功能以了解如何完成。