我在Azure存储中有一个队列,我希望能够将不同的消息类型添加到队列中,并将它们解析为特定类型。
例如。
public class Customer
{
public Customer()
{
}
public string Name { get; set;}
public string Email { get; set;}
public string Address { get; set;}
}
public class Employee
{
public Employee()
{
}
public string Id { get; set;}
public string Name { get; set;}
public string Email { get; set;}
}
我可以将它们序列化为JSON并将它们添加到队列中,但是如何在不知道消息类型的情况下将它们反序列化为特定类型?
我怎么知道下一条消息是客户还是员工?我可以在消息中添加某种属性:“这是客户”或“这是员工”......
因为我有一个辅助角色,它将在队列中查找消息并根据类型
执行特定操作get message from queue
If message = customer
do this
else if message = employee
do that
else
do nothing
答案 0 :(得分:1)
我在一个项目中做了以下事情。
将邮件类型存储为BrokeredMessage
的属性(其中entity
是我要发送的类):
var msg = new BrokeredMessage(entity);
msg.ContentType = entity.GetType().AssemblyQualifiedName;
myClient.Send(msg);
在接收方,我有这种扩展方法将消息作为正确的类型:
public static object GetBodyOfType(this BrokeredMessage msg)
{
var ofType = Type.GetType(msg.ContentType);
var method = typeof(BrokeredMessage).GetMethod("GetBody", new Type[] { });
var generic = method.MakeGenericMethod(ofType);
return generic.Invoke(msg, null);
}
我的实际接收者会这样做(receivedMessage
是BrokeredMessage
):
var msg = receivedMessage.GetBodyOfType();
给了我msg
这是我排队的类型。
我使用它的模式类似于你描述的模式。我将命令排队到ServiceBus,并有一个Worker Role来处理它通过命令处理程序收到的任何命令。到目前为止,它运作良好。
编辑:我刚才意识到您提到了存储队列,而上面是我用于服务总线的内容。希望解决方案适用。答案 1 :(得分:1)
Azure存储客户端库不提供对反序列化队列消息的显式支持。因此,请检查您使用的序列化程序。例如,如果您使用的是DataContractSerializer,则可以使用known types来处理序列化/反序列化期间的继承。
答案 2 :(得分:1)
我过去就这么做过。我已将对象的类型作为字符串记录到消息中,然后添加了一些分隔符号:#
然后添加了json-serialized string。
所以我的信息应该是这样的:
MyProject.Domain.Model.Product#{'Id':'42','ProductName':'SuperHumanEnchancer'}
在回来的路上,您在分隔符符号之前读取任何内容并将其视为类型名称。分隔符号后面的字符串将是您的json序列化字符串。