Поиск по агрегатам в DDD - PullRequest
       30

Поиск по агрегатам в DDD

0 голосов
/ 28 февраля 2019

У меня есть следующий сценарий в DDD.

public class Document
{
public int Id {get;set;}
public string DocumentCode {get;set;}
public int BuyerId {get;set;}
}

public class Buyer
{
public int Id {get;set;}
public string Name {get;set;}
}

И теперь я хочу найти все документы, содержащие покупателя, с именем "Джон".

Поскольку покупатель - это другой агрегатЯ думаю об этих сценариях

Создать новый агрегат

public class DocumentSearch
{
public int Id {get;set;}
public string DocumentCode {get;set;}
public int BuyerId {get;set;}
public string Name {get;set;}
}

«Проблема» в том, что этот агрегат должен прослушивать любые изменения Покупателя и применять изменениялокально.

Сохраняйте все как есть.

И на уровне БД создайте представление, которое будет действовать как новый агрегат.Проблема здесь в том, что он нарушает все принципы DDD, и приложение на самом деле не остается невежественным

Выполните поиск и присоединитесь на уровне приложения

По сути, выполните поиск по Документу, выполнитепоиск на покупателя и присоединиться к нему на уровне приложения.Я полагаю, что для этого потребуется больше времени и силы, поскольку оба набора изначально будут больше, чем они должны быть в объединенном поиске?

Каким будет путь, чтобы следовать принципам DDD?CQRS - окончательное решение, но я ищу переходное решение на пути к CQRS

1 Ответ

0 голосов
/ 28 февраля 2019

Задание вопроса не должно менять ответ.

Поскольку поиск не меняет ответ, обычно вам не нужна модель домена или доменные объекты для его поддержки..

Обычные решения - либо (а) запросить вашу модель данных напрямую, либо (б) создать «модель чтения» для поддержки запросов.

(а) - именно то, что говоритсяна олове.Если вы храните данные в РСУБД, то просто запросите -> dto?-> response.

Чтение моделей часто используется там, где поддержка запросов нежизнеспособна.Модель чтения - это, по сути, кэшированный DTO - вы создаете представление набора по мере изменения ситуации.Чаще всего вы увидите, что это делается асинхронно - запросы выполняются к «последнему» представлению, а фоновый рабочий процесс запускается для распространения изменений в этом представлении.

...