0

我正在尝试将我可以(重新)使用的“通用”订阅者放在一起Azure ServiceBus

但我被困如下;我的代码曾经去掉了非必要部分,看起来像这样。

Subscribing.Client.OnMessage((recdMessage =>
{
    var msgBody = recdMessage.GetBody<myClass>();
}, options);

我希望我msgBody的类型是已序列化到消息正文中的类型。事实上,如果myClass是类似的东西TelephonyEventMessage并且收到的消息是那种类型,那么我msgBody将是该类型的正确实例化/再水合对象。但是虽然我可以使用recdMessage. ContentType 以获取该消息中类的字符串名称....我只是想不出我需要在myClass上面放什么。我现在知识的尽头,没有多少搜索似乎对我来说是一个答案。我是否需要为我的消息中可能存在的每种类型添加特定版本?

4

1 回答 1

1

如果您期望有许多不同的对象类型,您可以使用它来接收来自订阅的消息:

public void ReceiveMessageFromSubscription<T>(string topicPath, string subscriptionName, Action<T> action)
{
    var client = SubscriptionClient.CreateFromConnectionString(ConnectionString, topicPath, subscriptionName);

    client.OnMessage((message) =>
    {
        try
        {
            _logger.Information("Processing message");
            action(message.GetBody<T>());
            message.Complete();
        }
        catch(Exception ex)
        {
            _logger.Error(ex, "Error processing message");
            message.Abandon();
        }
    } );
}

然后传入一个知道如何处理对象的方法,如下所示。您可以有许多这样的方法,它们都调用 ReceiveMessageFromSubscription。

public void ProcessObject()
{
    _serviceBusService.ReceiveMessageFromSubscription<MyObject>(mytopic, mysubscription, _myobjectService.ProcessObject);
}
于 2016-03-03T14:09:45.687 回答