【问题标题】:MassTransit Sub-Class when published is not consumed发布时的 MassTransit 子类未使用
【发布时间】:2021-08-01 07:26:31
【问题描述】:

我正在尝试创建通用实现以使用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


    【解决方案1】:

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

    您的问题是 similar to the this one, and my answer - 解决方案是一样的。将其转换为 object 并改用 Publish(object message) 重载。这样,MassTransit 将使用对象类型(MassTransit 将调用message.GetType() 并正确分派消息类型。

    或者,你也可以让你的界面包含一个泛型方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      相关资源
      最近更新 更多