我使用 RavenDB 作为从域事件填充的非规范化读取模型。我发现了问题,当两个事件(我们称它们为 Created 和 Updated)同时被非规范化时,在保存 Created 事件所做的更改之前加载要由 Updated 事件更新的文档。我提出了基于 Changes API 的解决方案来等待文档创建:
public static T WaitAndLoad<T>(this IDocumentSession @this, ValueType id)
where T : class
{
var fullId = @this.Advanced.DocumentStore.Conventions.FindFullDocumentKeyFromNonStringIdentifier(id, typeof(T), false);
var ev = new ManualResetEvent(false);
var cancelation = new CancellationTokenSource();
@this.Advanced.DocumentStore
.Changes()
.ForDocument(fullId)
.Subscribe(change =>
{
if (change.Type == DocumentChangeTypes.Put)
{
ev.Set();
}
}, cancelation.Token);
try
{
var existing = @this.Load<T>(id);
if (existing != null)
{
return existing;
}
ev.WaitOne();
return @this.Load<T>(id);
}
finally
{
cancelation.Cancel();
}
}
不幸的是,第二次调用 Load 返回 null,因为文档的 Id 已经在 InMemoryDocumentSessionOperations 的 knownMissingIds 字段中,并且没有向服务器发出请求。
还有其他方法可以等到创建文档吗?