MassTransit Sub-Class 发布时未被消耗

MassTransit Sub-Class when published is not consumed

我正在尝试创建通用实现以使用 MassTransit 发布消息。

BasePublisher

public abstract class BasePublisher
{
    private readonly IPublishEndpoint publishEndpoint;

    public BasePublisher(IPublishEndpoint publishEndpoint)
    {
        this.publishEndpoint = publishEndpoint;
    }

    public Task Publish(IntegrationBaseEvent message)
    {
        return publishEndpoint.Publish(message);
    }
}

IntegrationBaseEvent

public class IntegrationBaseEvent
{
    public IntegrationBaseEvent(Guid id, string name, DateTime createdDate)
    {
        Id = id;
        Name = name;
        CreationDate = createdDate;
    }

    public IntegrationBaseEvent()
    {
        Id = Guid.NewGuid();
        CreationDate = DateTime.UtcNow;
    }

    public Guid Id { get; private set; }

    public string Name { get; set; }

    public DateTime CreationDate { get; private set; }
}

并且我使用抽象 IntegrationBaseEvent.

创建了事件
public class BusinessCreatedEvent : IntegrationBaseEvent
{
    public Guid BusinessId { get; set; }

    public string BusinessName { get; set; }
}

使用下面的界面,我正在尝试发布消息,但它根本没有被消费

public interface IPublisher
{
    Task Publish(IntegrationBaseEvent message);
}

仅当我为继承的事件创建单独的发布者时才会使用它BusinessCreatedEvent如下所示

public interface ISubscriptionPublisher
{
    Task Publish(BusinessCreatedEvent message);
}

我不想创建不同的发布者,只想使用如下的摘要发布者。

public class BusinessCreatedEventHandler 
{
    private readonly IPublisher _publisher;

    public BusinessCreatedEventHandler(IPublisher publisher)
    {
        _publisher = publisher;
    }

    public Task Handle(string id, string name)
    {
        var message = new BusinessCreatedEvent
        {
            BusinessId = id,
            BusinessName = name
        };

        _publisher.Publish(message);

        return Task.CompletedTask;
    }
}

有什么让它通用的想法吗?

MassTransit 广泛利用泛型,并将类型限制为指定的泛型。由于您在对 Publish 的调用中将基接口指定为通用类型,因此基接口类型就是已发布的所有类型。

您的问题是 – 解决方案是一样的。将其转换为 object 并改用 Publish(object message) 重载。这样,MassTransit 将使用对象类型(MassTransit 将调用 message.GetType() 并正确发送消息类型。

或者,您也可以让您的界面包含通用方法:

public interface IPublisher
{
    Task Publish<T>(T message)
        where T : class, IntegrationBaseEvent;
}