2016-03-03 50 views
0

我試圖把一個'通用'訂戶放在一起,我可以(重新)使用Azure ServiceBus(Azure)BrokeredMessage.GetBody <xxx>

但我堅持如下; 我的代碼曾經剝離過非必要部分,看起來像這樣。

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

我希望我的msgBody是已序列化到消息體的類型。 事實上,如果myClass是類似於TelephonyEventMessage的東西,並且收到的消息是那種類型,那麼我的msgBody將是該類型的正確實例化/再水合的對象。 但雖然我可以使用recdMessage。 ContentType來獲取該消息中類的字符串名稱....我只是不能確定我需要在上面的myClass中放置什麼。 我現在已經掌握了我的知識,沒有多少搜索對我來說看起來像是一個答案。我是否需要爲消息中可能存在的每種類型添加特定版本?

回答

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); 
} 
相關問題