Как проанализировать данные из потока EventStore для правильного типа?

Я сохранил данные о событии в EventStore:

var data = new EventData(Guid.NewGuid(),
                         @event.GetType().ToString(),
                         true,
                         @event.ToJsonBytes(), 
                         @event.GetType().ToJsonBytes());

this.connection.AppendToStreamAsync(this.stream + "/" + aggregateId, 
                                    ExpectedVersion.Any, data);

Кажется, работает. Но как разобрать данные из EventStore, не указывая конкретный тип?

Я пробовал так, но это только анализирует данные для базового класса:

foreach (var data in result.Events)
{
   var @event = data.Event.Data.ParseJson<Event>();
   if (@event != null) // event contains only the base type data
   {
      events.Add(@event);
   }
}

Как вернуть данные для SomeSpecialEvent, полученные из Event? Существует несколько типов событий, и я не могу указать все здесь (механизм хранения не должен знать о конкретном типе).

Есть идеи, как поместить T в .ParseJson без использования дженериков?


person Beachwalker    schedule 02.12.2015    source источник


Ответы (1)


Сам нашел решение:

        var result = this.connection.ReadStreamEventsForwardAsync(this.stream + "/" + aggregateId, 0, 4095, false).Result;

        foreach (var data in result.Events)
        {
            var assemblyQualifiedName = data.Event.Metadata.ParseJson<string>();
            var type = Type.GetType(assemblyQualifiedName);
            var json = Helper.UTF8NoBom.GetString(data.Event.Data);
            var @event = JsonConvert.DeserializeObject(json, type) as Event;
            if (@event != null)
            {
                events.Add(@event);
            }
        }

Вам нужно добавить тип в метаданные при сохранении:

           var type = @event.GetType().AssemblyQualifiedName;

            var data = new EventData(
                Guid.NewGuid(),
                @event.GetType().Name,
                true,
                @event.ToJsonBytes(),
                type.ToJsonBytes());
person Beachwalker    schedule 02.12.2015