Я не эксперт по DDD (только через 100 страниц в книге Эрика Эвана), но я могу рассказать вам, что произошло в нашем случае с каталогом электронной коммерции.
Первоначально у нас был такой бизнес-поток в том же ограниченном контексте приложения на основе данных и ролей/разрешений запрашивающего пользователя, мы изменили переходы состояний (вы сказали ссылки, но на самом деле это суть, ссылки — это всего лишь один из способов представить переходы между состояниями), представленные пользователю. Это работало нормально, но выполнялось много повторяющейся логики. Затем мы добавили поисковое приложение с другим ограниченным контекстом, поскольку оно представляло одни и те же данные, но в разных коллекциях/группах, и мы не хотели, чтобы они рассинхронизировались.
Мы перешли к реализации CQRS, поэтому большая часть нашей бизнес-логики «предварительно вычислена», то есть она находится в чем-то вроде «партнерского контекста» как часть нашей проекции от модели записи к модели чтения. Мы не храним ссылки специально, а вместо этого помечаем разрешенное поведение данных. И приложение каталога, и приложение поиска используют эту модель чтения и ее флаги поведения для определения переходов состояний для представления клиенту.
Кое-что происходит на лету при запросе ресурса, практически на этапе сериализации. Мы нацелены на то, чтобы как можно больше переместить их в предварительно рассчитанные, но то, что мы не можем предварительно вычислить (только из-за масштаба), — это вещи, которые основаны конкретно на пользователе. Например, рекомендуемый поиск, который использует данные BI в поисковой системе для получения результатов. Мы могли бы предварительно рассчитать это для каждого отдельного пользователя, но сейчас цифры слишком велики для наших систем. Таким образом, мы отправляем расчетный ресурс основного приложения (из основного контекста) и передаем его через еще один партнерский контекст для дальнейшего уточнения.
другой вариант использования — некоторые ссылки представлены только аутентифицированному пользователю и, таким образом, скрыты от анонимных пользователей. Мы делаем это в основном контексте приложений, но это начинает немного мешать, потому что их присутствие указывает на то, что пользователь, стоящий за запросом, может делать в других приложениях (например, изменить пароль), и наш контекст на самом деле не является авторитетом того, что пользователь может сделать в каком-то другом приложении. Было бы лучше передать ресурс их контексту и позволить им обработать его, прежде чем мы вернем его пользователю. Одно простое решение, которое мы использовали для этого, заключалось в том, что вместо прямых ссылок на функции во внешнем контексте мы ссылаемся на корневой ресурс этого контекста и позволяем ему представлять переходы состояний. Это означает, что есть 2 запроса, но это очищает местоположения/полномочия логики.
person
Chris DaMour
schedule
26.05.2015