1

我将事件数据存储在 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);
   }
}

如何取回派生自 Event 的 SomeSpecialEvent 的数据?Event 类型有好几种,这里就不一一列举了(存储机制应该不知道具体的类型)。

任何想法如何在不使用泛型的情况下将 T 放入 .ParseJson 中?

4

1 回答 1

2

自己找到了解决办法:

        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());
于 2015-12-02T21:45:22.737 回答