如何解决不使用已发布的 MassTransit 子类
我正在尝试创建通用实现来发布带有 const faunadb = require("faunadb");
// your secret hash
const secret = process.env.FAUNADB_SECRET_KEY;
const q = faunadb.query;
const client = new faunadb.Client({ secret });
console.log("CALLLED API")
module.exports = async (req,res) => {
const formData = req.body.data;
console.log("API CALL");
try {
const dbs = await client.query(
console.log("API UPDATE"),console.log(formData),q.Update(
q.Ref(q.Collection('Likes'),'305446225474224651'),{
data: {
like: formData.likes[0].data.like + 1
},}
)
);
// ok
res.status(200).json(dbs.data);
} catch (e) {
// something went wrong
res.status(500).json({ error: e.message });
}
};
的消息。
BasePublisher
MassTransit
IntegrationBaseEvent
public abstract class BasePublisher
{
private readonly IPublishEndpoint publishEndpoint;
public BasePublisher(IPublishEndpoint publishEndpoint)
{
this.publishEndpoint = publishEndpoint;
}
public Task Publish(IntegrationBaseEvent message)
{
return publishEndpoint.Publish(message);
}
}
我已经使用抽象 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);
}
有什么想法可以让它通用吗?
解决方法
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。