2012-01-31 55 views
0

我目前正在使用J奥利弗的EventStore,我想知道如何在我的电话(GetById(Guid id))中检查一个聚合是否存在?CQRS/EventStore:如何检查一个聚合是否存在?

按照CQRS的工作原理,我应该查询读取的数据库还是应该查明EventStore中是否有相应的聚合?

TIA

JD

回答

3

的EventStore工作在此刻的样子,你会创建一个新流(聚合根)如果找不到流。

检查这一行: https://github.com/joliver/CommonDomain/blob/master/src/proj/CommonDomain.Persistence.EventStore/EventStoreRepository.cs#L53

它呼吁商店这种方法: https://github.com/joliver/EventStore/blob/master/src/proj/EventStore.Core/OptimisticEventStore.cs#L45

调用该构造函数: https://github.com/joliver/EventStore/blob/master/src/proj/EventStore.Core/OptimisticEventStream.cs#L27

的影响是,它会要么流使用填充提交它在持久性中找到,或者如果没有找到它,它将不会执行任何操作并返回新的Stream。

但是,你不应该问自己这个问题。在发送命令之前,应对命令进行验证。在发送之前使用您的读取模型来验证命令。

另外,Command和Aggregate根状态应该有足够的信息来执行您在域中的决定。这基本上意味着在发送命令之前必须确定域状态,以避免域中出现异常。你可以使用它的读取模型。

更新为Mauros评论的回应:

你有一个并发的问题。您可以通过使用偶尔连接的正在合并的系统中使用的方法来解决此问题。你可以做的就是将Stream修订版存储在读取模型中,以便知道你已经对哪个版本的AR进行了操作。然后,当处理命令时,您知道您是否在AR的旧状态上执行操作。

如果AR修订版本高于命令带来的版本,您可以将该命令作为失败(悲观并发)丢弃,也可以尝试合并更改。

这可以通过查看命令中修订产生的事件直到当前状态。然后调用命令应该执行的行为并查看由该行为创建的事件并比较两个事件集合。如果没有任何冲突的事件,您可以将新创建​​的事件提交给商店。如果有冲突,你可以抛出一个并发异常。

我认为这是解决此类并发问题的最佳选择。

搜索事件合并以获取更多信息。

+0

“命令应该在发送之前进行验证”..如果读取的模型是“过时的”,因为另一个客户端正在向持久性发送事件,该怎么办?我正在努力解决这个问题 – 2012-02-01 07:32:21

+0

我已经更新了答案,因为它不适合评论字段,尽管应该更好地使用单独的问题。 – 2012-02-01 09:19:29

+0

@MikaelÖstberg:非常感谢您提供的信息。目前我没有直接使用EventStoreRepository,因为我仍然在学习CQRS,并且遇到了使用CommonDomain的问题。你知道任何使用CommonDomain的项目/秒杀代码吗? – 2012-02-01 10:22:51

1

我猜你实际上是指JOliver的CommonDomain项目中的IRepository.GetById()

当您使用不在事件存储中的聚合根ID调用GetById时,存储库将为您提供一个新的聚合对象,其中.Version == 0和.Id == Guid.Empty。我刚刚创建了自己的衍生库,其检测条件,返回null而不是:

public override TAggregate GetById<TAggregate>(Guid id, int versionToLoad) 
{ 
    var aggregate = base.GetById<TAggregate>(id, versionToLoad); 
    return aggregate.Version > 0 ? aggregate : null; 
} 

这可能是错误的方式去了解它(见的Mikael的答案),但它的工作对我罚款至今。

+0

实际上,我想我已经在某个地方看过Jonathan Oliver正在考虑改变这个问题的行为,因为在询问现有的Stream时隐含地创建并返回一个新的Stream是非常奇怪的。 – 2012-01-31 19:13:31

+0

@Eric:感谢代码。我一定会使用它。目前我没有使用EventStoreRepository,而是直接学习我使用store.openStream()等,并没有到目前为止的快照概念。所以也许现在是切换到EventStoreRepository的时候了。 – 2012-02-01 10:29:34

+0

@Eric:如果您的命令层中的聚合为空,您是否引发异常,或者如果没有聚合,在GetById <>中引发异常会更好吗? – 2012-02-01 11:12:28

相关问题