Сериализация / десериализация сообщений в EventStore/EventHub
Если и производитель, и потребитель событий / сообщений основаны на.Net/C#, я склонен использовать метаданные в полезной нагрузке, чтобы иметь возможность десериализовать данные в POCO C#, например:
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#?
2 ответа
Для меня логичным ответом будет добавление обязательного EventType в любые события JSON, используемые в разных контекстах.
Таким образом, EventType должен быть обязательной частью данных, а не метаданных.
Класс 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"];
}
}