Я использую RavenDB как денормализованную модель чтения, заполненную событиями домена. Я обнаружил проблему, когда два события (назовем их «Создано и обновлено») денормализуются одновременно, загружая документ, который будет обновляться обновленным событием, происходит до сохранения изменений, внесенных созданным событием. Я придумал решение, основываясь на изменениях API ждать создания документа:RavenDB - ждать создания документа
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 возвращает нуль, потому что Id документа уже в поле knownMissingIds в InMemoryDocumentSessionOperations и никакого запроса к серверу не производится.
Есть ли какой-либо другой способ подождать, пока не будет создан документ?