Должен ли объект домена быть создан обработчиком события в совокупности - PullRequest
1 голос
/ 15 января 2020

Когда мы вызываем действие домена в Aggregate, мы передаем некоторые примитивы / domain_objects, мы проверяем некоторые бизнес-правила и применяем событие домена в конце. и когда мы применяем событие, наконец, мы обновляем состояние объекта. На этом последнем этапе мы должны создать объекты или загрузить объект из репозитория. Это кажется мне трудным или неправильным, потому что есть много повторений задач.

Вот пример:

Действие домена

def create(uuid:, name:, description:, start_date:, end_date:, customer:, contact_person: , type: , manager:,
           department:, author:)
  result = Contracts::CreateContract.new(object: self).call(start_date: start_date, end_date: end_date)
  raise Exceptions::DomainError.new(payload: result) if result.errors.present?
  data = build_creat_event_data(uuid: uuid,
                           name: name,
                           description: description,
                           start_date: start_date,
                           end_date: end_date,
                           customer: customer,
                           contact_person: contact_person,
                           type: type,
                           manager: manager,
                           department: department,
                           author: author)
  apply(ProjectManagementDomain::Events::ProjectCreated.strict(data: data))
end

Применение события

def apply_project_created(event)
      @uuid = event.data[:uuid]
      @name = event.data[:name]
      @description = event.data[:description]
      @status = STATUSES.dig(:draft)
      @type = ProjectType.new(event.data[:type])
      @start_date = event.data[:start_date]
      @end_date = event.data[:end_date]
      @customer = Customer.new(event.data[:customer])
      @manager = Manager.new(event.data[:manager])
      @department = Department.new(event.data[:department])
      @contact_person = ContactPerson.new(event.data[:contact_person])
      @legacy_id = event.data[:legacy_id]
    end

, как вы можете видеть в приведенном выше коде, который я должен build event_data build_creat_event_data, которая преобразует доменные объекты в примитивы для события (потому что рекомендуется помещать примитивы в событие). Затем, когда мне нужно применить это событие, я должен снова создать объекты. Я делаю это неправильно или чего-то не хватает?

Какой подход должен быть лучшим здесь?

...