我正在使用Rabbitmq客户端来生成和使用消息。我的消息是这样的。
public interface IMessage{}
public class PlaceOrder: IMessage{
public string id{ get; set; }
}
我有两个c#console应用程序项目。其中一个生产者,另一个是消费者。
public class Producer{
public void Save(IMessage message){
....
var serializedObject = JsonConvert.SerializeObject(message);
....
// append queue serializedObject
}
}
public class Consumer{
public void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, IBasicProperties properties, byte[] body){
....
var message = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(body));
....
}
}
此处message
类型为Object。消费者控制台应用程序不知道 PlaceOrder 类型。它只知道IMessage接口类型。如何投射或转换原始类型。
答案 0 :(得分:3)
查看NewtonSoft.Json TypeNameHandling enumeration中的选项。在JsonSerializerSettings上设置此项并将其传递给您对De/SerializeObject()
的调用。
您可能还想评估EasyNetQ,这是专门针对此方法开箱即用的,并添加了其他功能。
请注意,(在架构上)坚持消息生成者和使用者始终使用具有相同消息结构的同名类型可能存在一些缺点。您最终可以紧密耦合所有生产者和消费者,这样当消息格式发生变化时,所有生成器和消费者都必须以锁定步骤部署(与采用Tolerant Reader方法相反,这可以允许更松散耦合的生成器进化和消费者)。取决于您的项目目标,但需要考虑的一个方面。