如何从 EventStore 流中解析回数据以正确类型?
How to parse back data from EventStore stream to correct type?
我将事件数据存储在 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 解析回数据?
我试过这种方式,但这只解析了基础数据class:
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 的数据?
有几种事件类型,我不能把所有的都放在这里(存储机制应该不知道具体类型)。
知道如何在不使用泛型的情况下将 T 放入 .ParseJson 中吗?
自己找到解决办法:
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());
我将事件数据存储在 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 解析回数据?
我试过这种方式,但这只解析了基础数据class:
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 的数据? 有几种事件类型,我不能把所有的都放在这里(存储机制应该不知道具体类型)。
知道如何在不使用泛型的情况下将 T 放入 .ParseJson 中吗?
自己找到解决办法:
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());