2

イベント/メッセージのプロデューサーとコンシューマーの両方が .Net/C# ベースである場合、次のようにデータを C# POCO に逆シリアル化できるようにするために、ペイロードでメタデータを使用する傾向があります。

Data
{
  "X": {
    "a": "bb811ea5-6993-e511-80fc-1458d043a750",
    "b": "ddd",
    "b": "dddd",
    "d": true
  }
  "x1": 1.1234,
  "x2": 2.3456,
  "EventUtcDateTime": "2016-02-16T08:55:38.5103574Z"
}

Metadata
{
  "TimeStamp": "02/16/2016 08:55:37",
  "EventClrTypeName": "Bla.Di.Bla.SomeClass, Bla.Di.Bla, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}

プロデューサーが .Net/C# ベースではない状況での適切な解決策は何でしょうか?

4

2 に答える 2

7

EventDataクラスには、メッセージにメタデータを追加できるプロパティProperties ... が含まれています。

送信操作中にユーザーが明示的に追加したイベント データのユーザー プロパティを取得します。

イベントを送信するには:

var eventHubClient = EventHubClient.CreateFromConnectionString("connectionString", "eventHubName");
var mypoco = new POCO();
// ...

// Get the Json string
var stringBody = JsonConvert.SerializeObject(mypoco);

// Create the event data
var eventData = new EventData(Encoding.UTF8.GetBytes(stringBody));

// Add the event type.
eventData.Properties.Add("EventType", typeof(POCO).Assembly.FullName);

// Send the data.
eventHubClient.Send(eventData);

メッセージの受信中に、メッセージのメタデータからイベント タイプを取得します。

async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
{
    foreach (EventData eventData in messages)
    {
        var jsonBody = Encoding.UTF8.GetString(eventData.GetBytes());

        //Get the event type
        var eventTypeName = (string)eventData.Properties["EventType"];
        var eventType = Type.GetType(eventTypeName);

        // Deserialize the object
        var myPoco = JsonConvert.DeserializeObject(jsonBody, eventType);
    }
}

それ以外の場合は、 JObjectを使用してボディ タイプを取り除くことができます

async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
{
    foreach (EventData eventData in messages)
    {
        var jsonBody = Encoding.UTF8.GetString(eventData.GetBytes());

        // Deserialize the json as a JObject
        var myPoco = JObject.Parse(jsonBody);
        var a = myPoco["X"]["a"];

    }
}
于 2016-03-21T01:41:45.200 に答える
2

私にとって論理的な答えは、異なるコンテキストで共有される JSON イベントに必須の EventType を追加することです。

したがって、EventType は、メタデータではなくデータの必須部分である必要があります。

于 2016-02-17T15:06:11.627 に答える