Domain driven design DDD中实体构造的资源查找

Domain driven design DDD中实体构造的资源查找,domain-driven-design,ddd-repositories,Domain Driven Design,Ddd Repositories,我是DDD的新手,我的困境是: 我必须坚持一个有实体B的实体A(让我们考虑这两个都是实体根)。UI层通过一个DTO(A的DTO类)收集所有这些信息(在控制器上),将属性映射到DTO中A的新实例,现在对于A中B的引用,UI发送一个id。由于我在存储库后面使用ORM,我想从BRepository中查找B的对象实例,填充我们正在构建的新实例上的引用,并最终调用ARepository.save(实例) 我有几个选择 在UI层(在控制器或某种服务外观中)或 在名为createA的应用程序服务中,甚至在域服

我是DDD的新手,我的困境是:

<>我必须坚持一个有实体B的实体A(让我们考虑这两个都是实体根)。UI层通过一个DTO(A的DTO类)收集所有这些信息(在控制器上),将属性映射到DTO中A的新实例,现在对于A中B的引用,UI发送一个id。由于我在存储库后面使用ORM,我想从BRepository中查找B的对象实例,填充我们正在构建的新实例上的引用,并最终调用ARepository.save(实例)

我有几个选择

  • 在UI层(在控制器或某种服务外观中)或
  • 在名为createA的应用程序服务中,甚至在域服务中执行此操作
  • 哪一个选项是正确的??。这里真正突出的是通过id查找B的过程,以获得要在对象上设置的引用,这同样可以被认为是保持ORM满足或保持域模型一致的过程。在A上设置B的引用的过程中,可能会有一些隐含的业务规则和验证,我认为这些是决策的驱动点


    此外,如果验证是在实体创建过程中进行的,并且说构造函数和/或设置器通过特定的错误(这些错误可以通过UI冒泡到客户端,并通过repos进行另一级别的验证),那么这里可能会进一步引起这一论调的还有验证方面的考虑因素??或者,作为控制器中的一个明确步骤,这两个选项都是正确的,但我倾向于选择选项2,因为应用程序服务提供的封装有助于阅读和理解代码。它还使您更容易整合域的API。支持选项1而不是选项2的理由是,由于使用应用程序服务而产生的额外的封装层是不必要的复杂性,尽管您当然是评判者。验证通常表现在应用程序的几个层中,包括表示层和域层。一次编写验证逻辑并在其他地方重用似乎是理想的,在实践中,复制验证逻辑通常更容易。这意味着表示层(如ASP.NET MVC)有自己的视图模型验证声明。然后,应用程序服务和域实体还应该执行该上下文中所需的任何验证。请查看我在上的帖子以及关于这些主题的深入讨论。

    这两个选项都是正确的,但我倾向于选择选项2,因为应用程序服务提供的封装有助于阅读和理解代码。它还使您更容易整合域的API。支持选项1而不是选项2的理由是,由于使用应用程序服务而产生的额外的封装层是不必要的复杂性,尽管您当然是评判者。验证通常表现在应用程序的几个层中,包括表示层和域层。一次编写验证逻辑并在其他地方重用似乎是理想的,在实践中,复制验证逻辑通常更容易。这意味着表示层(如ASP.NET MVC)有自己的视图模型验证声明。然后,应用程序服务和域实体还应该执行该上下文中所需的任何验证。请看我在上发表的文章以及关于这些主题的深入讨论。

    DTO只是一个方便的类,用于在UI层中传输数据。您使用ID来引用B是UI层的一个实现细节。因此,UI层/控制器的工作应该是将DTO映射到域对象,包括将ID转换为引用


    另一方面,验证正确地属于域层。在这方面,UI的唯一任务是在域对象中设置值并显示由此产生的任何错误。

    DTO只是一个方便的类,用于在UI层内传输数据。您使用ID来引用B是UI层的一个实现细节。因此,UI层/控制器的工作应该是将DTO映射到域对象,包括将ID转换为引用


    另一方面,验证正确地属于域层。在这方面,UI的唯一任务是在域对象中设置值并显示由此产生的任何错误。

    非常感谢这些链接!非常感谢这些链接!