顺便问一下,你如何创建一个STREAM?
我直接使用AppendToStreamAsync,这是正确的还是我先创建一个流然后追加到这个流?
我也尝试过执行一些测试但是使用下面的方法我可以将事件写入EventStore但不能从中读取事件。
最重要的问题是如何在EventStore的管理站点中查看我的保存事件?
这是代码:
public async Task AppendEventAsync(IEvent @event)
{
try
{
var eventData = new EventData(@event.EventId,
@event.GetType().AssemblyQualifiedName,
true,
Serializer.Serialize(@event),
Encoding.UTF8.GetBytes("{}"));
var writeResult = await connection.AppendToStreamAsync(
@event.SourceId.ToString(),
@event.AggregateVersion,
eventData);
Console.WriteLine(writeResult);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
public async Task<IEnumerable<IEvent>> ReadEventsAsync(Guid aggregateId)
{
var ret = new List<IEvent>();
StreamEventsSlice currentSlice;
long nextSliceStart = StreamPosition.Start;
do
{
currentSlice = await connection.ReadStreamEventsForwardAsync(aggregateId.ToString(), nextSliceStart, 200, false);
if (currentSlice.Status != SliceReadStatus.Success)
{
throw new Exception($"Aggregate {aggregateId} not found");
}
nextSliceStart = currentSlice.NextEventNumber;
foreach (var resolvedEvent in currentSlice.Events)
{
ret.Add(Serializer.Deserialize(resolvedEvent.Event.EventType, resolvedEvent.Event.Data));
}
} while (!currentSlice.IsEndOfStream);
return ret;
}
在编写事件时会自动创建流。您应该遵循建议的命名约定,因为它启用了一些开箱即用的功能。
await Connection.AppendToStreamAsync("CustomerAggregate-b2c28cc1-2880-4924-b68f-d85cf24389ba", expectedVersion, creds, eventData);
我们建议使用DDD + CQRS模式将您的流调用为“category-id” - (在我们的例子中,类别是聚合名称)
CustomerAggregate-b2c28cc1-2880-4924-b68f-d85cf24389ba
当您将更多事件写入相同的流名称时,流会成熟。
在我们的案例中,第一个事件ID成为“aggregateID”,然后每个新的eventID都是唯一的。重新创建聚合的唯一方法是按顺序重放事件。如果序列失败,则抛出异常
使用此命名约定的原因是,为方便起见,Event Store会运行一些默认的内部投影。 Here is a very convoluted documentation about it
按类别
按类别基本上意味着有使用内部投影创建的流,对于我们的CustomerAggregate
,我们订阅$ce-CustomerAggregate
事件 - 我们将只看到那些“类别”而不管他们的ID - 事件数据包含我们需要的所有内容。
我们使用持久订阅者(小型C#控制台应用程序),它们设置为与$ce-CustomerAggregate
一起使用。持久订阅者很棒,因为他们记住了客户承认的最后一个事件。因此,如果应用程序崩溃,则启动它并从应用程序完成的最后一个位置开始。
这是事件存储开始闪耀并从其他“事件存储实现”中脱颖而出的地方
查看您的活动
持久订阅者的示例是使用代码进行设置的一种方法。
您无法在管理网站中真正查看“全部”数据。管理站点的目的是管理投影,管理用户,查看一些统计信息,创建一些预测,以及仅查看流和事件的最新视图。 (如果您知道ID,则可以根据需要创建URL - 但是您无法搜索它们)
如果你想通过使用像Postman这样的东西来使用see ALL the data then you use the RESTfull API。也许有第三方软件可以创建像数据源查看器的网格,但我不知道这一点。这可能只是挂钩到REST API,你可以很快地以这种方式创建自己的可视化工具。
再次返回代码,您还可以始终使用库读取0中的所有事件 - 顺便使用DDD + CQRS,您始终从0读取聚合流以重建其状态。但是你可以为其他要求做同样的事情。
在某些情况下,查看如何使用快照会使重播事件分配得更快,如果您有一个非常大的流来处理。
模式转变
事件存储具有相当的学习曲线,是传统事务数据库的范例转换。活动商店最好的朋友是CQRS - 我们使用CQRS Lite open source framework的略微修改版本
要真正了解Event Store,您需要了解DDD概念,然后深入了解CQRS / ES - 有一些很好的YouTube视频和示例。