【发布时间】:2020-01-15 12:20:48
【问题描述】:
当我们在聚合上调用域操作时,我们传递一些原语/域对象,我们验证一些业务规则并在最后应用域事件。当我们最终应用事件时,我们会更新对象的状态。在这最后的步骤中,我们必须从存储库创建对象或加载对象。这对我来说似乎很困难或错误,因为有很多重复的任务。
这是一个例子:
域操作
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
正如您在上面的代码中看到的,我必须构建 event_data build_creat_event_data,它将域对象转换为事件的原语(因为建议将原语放入事件中)。然后,当我必须应用该事件时,我必须再次创建对象。我做错了还是缺少了什么。
这里最好的方法应该是什么?
【问题讨论】:
标签: ruby domain-driven-design cqrs event-sourcing rails-event-store