Я реализую шаблон CQRS с источником событий, я использую NServiceBus, NEventStore и NES (соединяется между NSB и NEventStore).
Мое приложение будет регулярно проверять веб-службу на предмет загрузки и обработки любого файла. когда файл найден, на шину отправляется команда (DownloadFile), которую получает FileCommandHandler, который создает новый совокупный корень (File) и обрабатывает сообщение.
Теперь внутри (корень совокупного файла) я должен проверить, что содержимое файла не совпадает с каким-либо другим содержимым файла (поскольку веб-служба гарантирует, что только имя файла является уникальным, а содержимое может дублироваться с другим именем) , путем хеширования и сравнения со списком хешированного содержимого.
Вопрос в том, где мне сохранить список хеш-кодов? разрешено ли запрашивать модель чтения?
public class File : AggregateBase
{
public File(DownloadFile cmd, IFileService fileDownloadService, IClaimSerializerService serializerService, IBus bus)
: this()
{
// code to download the file content, deserialize it, and publish an event.
}
}
public class FileCommandHandler : IHandleMessages<DownloadFile>, IHandleMessages<ExtractFile>
{
public void Handle(DownloadFile command)
{
//for example, is it possible to do this (honestly, I feel it is not, since read model should always considered stale !)
var file = readModelContext.GetFileByHashCode (Hash(command.FileContent));
if (file != null)
throw new Exception ("File content matched with another already downloaded file");
// Since there is no way to query the event source for file content like:
// eventSourceRepository.Find<File>(c=>c.HashCode == Hash(command.FileContent));
}
}