Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在CQR中何处创建价值对象&;DDD流_Ruby On Rails_Domain Driven Design_Cqrs_Event Sourcing_Rails Event Store - Fatal编程技术网

Ruby on rails 在CQR中何处创建价值对象&;DDD流

Ruby on rails 在CQR中何处创建价值对象&;DDD流,ruby-on-rails,domain-driven-design,cqrs,event-sourcing,rails-event-store,Ruby On Rails,Domain Driven Design,Cqrs,Event Sourcing,Rails Event Store,在命令的生命周期中,我正在努力构建ValueObjects 以下是我的情况: 命令请求到达控制器操作 使用请求参数创建命令对象 将命令对象传递给应用程序服务 命令处理程序首先验证命令属性 然后创建聚合并将命令属性传递给聚合函数 和聚合函数将属性传递给域事件 我的问题是我应该把对象创建逻辑放在哪里。或者换句话说,DDD的哪个组件负责初始化对象(值对象、实体等),以便聚合使用?您可以在其他服务中委托创建域模型,实际上,它们是域服务的一部分。您可以将一些基本数据或DTO传递给他们,最后,您可以从他们那

在命令的生命周期中,我正在努力构建ValueObjects

以下是我的情况:

  • 命令请求到达控制器操作
  • 使用请求参数创建命令对象
  • 将命令对象传递给应用程序服务
  • 命令处理程序首先验证命令属性
  • 然后创建聚合并将命令属性传递给聚合函数
  • 和聚合函数将属性传递给域事件
    我的问题是我应该把对象创建逻辑放在哪里。或者换句话说,DDD的哪个组件负责初始化对象(值对象、实体等),以便聚合使用?

    您可以在其他服务中委托创建域模型,实际上,它们是域服务的一部分。您可以将一些基本数据或DTO传递给他们,最后,您可以从他们那里得到有效的域模型。我可以提到的常见模式是Factory模式或Builder模式,它们通常使用域模型的受保护构造函数来创建新的域模型。请注意,域模型的构造函数应该是包保护的,只有域服务可以创建域模型。这意味着您的域模型的构造函数不应该从核心域之外访问,为了创建域模型,您可以将域服务(工厂、构建器)注入用例或应用程序服务

    我的问题是我应该把对象创建逻辑放在哪里。或者换句话说,DDD的哪个组件负责初始化对象(价值对象、实体等),以便聚合使用

    通常的答案是,域对象创建是通过“工厂”(参见Evans,第6章)进行的,工厂通常从域模型导出,并由需要它们的应用程序代码调用

    工厂本身可能是一个对象,也可能只是一个函数,甚至是一个构造函数

    Citerus对DDD样本的审查可能有助于说明:

    在这里,控制器提取必要的数据(作为原语),并将该信息传递给
    changeddestination
    逻辑


    在中的下一个类中,字符串替换为
    值对象
    ;在这种情况下,TrackingId构造函数和UnLocode构造函数实现工厂角色。然后将值对象传递到
    变更目的地
    逻辑。

    请在标题中扩展CQRS和DDD。添加一个你正在做什么的例子,并阐明你想要达到的目标。CQR和DDD是著名的概念,你建议如何扩展。我已经解释了我正在做的步骤,并在最后回答了我的问题。我不能把我的代码粘贴到这里。域模型的初始化应该在域服务中实现,比如工厂或构建器。它们应该位于您的核心域中,尤其是在域服务目录中。我还可以使用聚合内部的工厂吗。因为我不想公开聚合方法的内部。那么,如果我通过工厂聚合数据并将数据从工厂/构建器提供给我的事件?