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