0

我一直在关注 Event Store 有一段时间了,让我感到难过的一件事是什么时候应该考虑编写投影?创建展平投影是常见的做法吗?

此处的设置使用每个聚合的流

例如,假设我有 2 个如下所示的事件:

public class OrderPlaced
{
    public OrderPlaced(string reference, Currency currency, Amount amount)
    {
        ...
    }

    public string Reference { get; }

    public Currency Currency { get; } //Custom type

    public Amount Amount { get; } //Custom type
}

public class OrderCompleted
{
    public OrderCompleted(string reference)
    {
        this.Reference = reference;
    }

    public string Reference { get; }
}   

我有以下查询:

fromCategory('MyCategory')
  .whenAny(function(s, e) {
      linkTo("Foo", e);
  })

以上并没有做很多事情,只是将所有流聚合成一个单数。是否可以将更平坦的视图投影到例如这样的东西中?也许我的电线交叉但显然使用emit可以实现这一点?

{
    string Reference;
    string CurrencyCode;
    decimal PayingAmount;
}

我的想法是,一旦我写入流,我可以保证聚合处于有效状态,因此对于任何相关方,我应该只公开这些过程所需的字段。投影一个简单的模型(去规范化的视图)是正确的做法吗..

上面是一个简单的示例,但您可以想象聚合稍微复杂一些。

如果我遗漏了任何内容或需要进一步澄清,请发表评论,我可以添加。

4

1 回答 1

2

您正在寻找标准事件类别投影。

它向 Steam 发出链接事件,称为“$ce-”。那里的类​​别是您的对象类型。

例如,您的聚合类型是Order,并且您将事件OrderCreated,OrderLineAdded等写入名称为Order-1,的流Order-2,其中 1 和 3 是您的聚合根 ID。然后,$ce-Order流将包含该类型的所有聚合的所有事件。

查看标准投影文档

通常这正是创建读取端投影的方法——通过在类别流上创建追赶订阅并相应地更新读取模型。

为了运行投影,您需要使用--run-projections=all –-start-standard-projections=true它来查看它的工作情况。

于 2017-01-20T13:19:56.920 回答