Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在EventStore中搜索流_C#_.net_Domain Driven Design_Eventstoredb - Fatal编程技术网

C# 在EventStore中搜索流

C# 在EventStore中搜索流,c#,.net,domain-driven-design,eventstoredb,C#,.net,Domain Driven Design,Eventstoredb,是否可以不通过StreamId而是通过另一个流属性来搜索流?例如,如果每个流的标题中都有CustomerId,并且我希望搜索具有特定CustomerId的所有流。事件存储旨在专门支持通过实体的键进行检索。为了支持其他属性的检索,数据以最终一致的、非规范化的方式进行索引,专门针对每个用例,并在单独的位置进行索引。因此,事件存储区仅存储事件,并使用索引投影来支持任何排序的查询。这些视图有点像关系数据库中的持久视图,但它们可以存储在简单的键值存储中。事件存储和投影存储共同构成+体系结构背后的基础设施的

是否可以不通过StreamId而是通过另一个流属性来搜索流?例如,如果每个流的标题中都有CustomerId,并且我希望搜索具有特定CustomerId的所有流。

事件存储旨在专门支持通过实体的键进行检索。为了支持其他属性的检索,数据以最终一致的、非规范化的方式进行索引,专门针对每个用例,并在单独的位置进行索引。因此,事件存储区仅存储事件,并使用索引投影来支持任何排序的查询。这些视图有点像关系数据库中的持久视图,但它们可以存储在简单的键值存储中。事件存储和投影存储共同构成+体系结构背后的基础设施的一部分。有关此主题的更多信息,请查看该博客的其余部分。

您可能试图错误地使用事件存储。事件存储区仅用于保存和读取提交的事件流,以重建事件源聚合。实现提供了用于方便地实现基础架构关注点的头,例如请求/响应关联ID、审核、安全性等。如果您发现自己将业务属性(如客户id)放入其中,那么您可能需要按照@eulerfx的建议构建一个读取模型


如果您要查找的ID,那么您应该考虑为该客户机定制Cuffer-ID的实际事件流ID。通过ID加载特定客户正是事件存储要做的事情。

EventStore现在有了可以实现您所需功能的预测。详情请参阅本博客


虽然这可能不是查找内容的最有效方法,但如果您确实需要流列表以便搜索或查找特定的流,则有一个$streams系统投影,但需要先启用它,然后才能使用此powershell:

uri$ = http://${EventStoreIP}:${EventStoreHttpPort}/projection/${projection}/command/enable

$result = Invoke-WebRequest -Method Post -Uri $uri -UseBasicParsing -TimeoutSec 90 -Headers @{
    Authorization = Get-BasicAuthCredentials
}

其中,$projection是“$streams”。还可以查看其他可以以相同方式启用的系统投影,它们可以更精确地提供您所需的内容,这些内容记录在此处:

错误。在你看来,这可能是真的。但实际上,有一个非常流行的事件存储实现,它允许通过聚合id以外的其他属性查询聚合。事实上,这种事件存储的实现看起来非常不可用。或者在非常罕见和特殊的情况下使用。GetEventStore是使用CQR的中小型应用程序的正确方式。关于什么错误?是的,EventStore投影系统允许您根据事件中的任何属性为事件编制索引,但问题在于该索引最终是一致的,它在后台更新。在实践中,更好的选择是将二级索引存储在快速原子存储中,如Redis。理论上,查找表可能是好的。但在实践中,对于具有百万/十亿事件的事件存储,生成这样的查找表是不可行的。投影允许您过滤事件。因此,无需生成/分区这样的查找表。因为您可以生成快照并利用投影,所以在按任何属性搜索聚合时,这是最好的方法。您在第一行就错了:“事件存储被设计为只支持实体键的检索。”另外,据我所知,getEventStore中的投影并不仅仅用于生成其他事件。它们用于简单地重新调用某些结果,并在应用程序中使用该结果来构建特定的聚合。与sql语言中的WHERE子句相同的查询机制。创建流非常便宜,因此在每次事件进入(用于处理)时通过投影创建大量其他流,如CustomerId-123,是实现所需索引的一种方法,不会造成太多性能损失。