DDD и CQRS — определение объекта для варианта использования «Планирование»

У меня есть пример использования планирования человека на какую-то работу в течение некоторого периода времени. Например. Сервис для назначения человека А на работу в интервале времени от X до Z в локации C.

Единственное ограничение, которое у него есть, это то, что один человек не может работать над двумя вещами одновременно. Например. если человек А назначен на работу с 21 июля 2019 г. по 25 июля 2010 г., то человек А не может быть назначен на какую-либо другую работу в это время. Например. Человек А для временного диапазона с 23 июля 2019 г. по 27 июля 2019 г. не должен быть возможен.

Я пытаюсь сделать для него услугу, используя дизайн, управляемый доменом, который назначит человека на какую-то работу. Я думал, что сущность будет выглядеть примерно так:

class Assignment {
    PersonId,
    startTime,
    endTime,
    location
}

Теперь я хотел убедиться, что если я найду в своей базе данных запись для человека А в каком-то временном диапазоне, то вызов для создания записи для человека А во временном диапазоне, который перекрывается с существующими, не будет выполнен.

Поскольку я использую модель CQRS с DDD, поэтому я не хочу делать запрос в свою базу данных, запрашивая все назначения для этого человека. Это не всегда могут быть последние данные из-за возможной непротиворечивости модели CQRS. Я знаю, что в моем первичном ключе будет PersonId, но я не уверен, как я могу использовать в нем время начала и окончания.

Любые предложения, что я могу сделать для достижения моей цели для этого? Разве использование DDD и CQRS не является хорошей идеей? Или есть лучший способ смоделировать эту сущность, чтобы я мог достичь своей цели.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
196
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Since, I am using CQRS model with DDD, so I don't want to make a query to my database asking for all the assignments for that person.

CQRS — это просто разделение между чтением и записью (команды и запросы). При выполнении команд вы можете запрашивать модель записи.

Если у вас есть назначения в качестве объекта значения агрегата Person, легко проверить, есть ли одновременно более двух назначений. И если назначения должны быть отдельным агрегатом, то агрегат Person должен содержать ссылку на назначения.

Если Задание является Совокупным, вам также может потребоваться убедиться, что Задание назначено только одному человеку. В этом случае может иметь смысл использовать диспетчер процессов или сагу, чтобы гарантировать, что все инварианты поддерживаются, и запускать компенсирующие команды, если это не так.

CPerson 19.07.2019 14:08

Другие вопросы по теме