繁体   English   中英

DDD / Presenter模式VS用例最优查询

[英]DDD / Presenter pattern VS Use case optimal query

在这关于域驱动设计的好书中 ,有一章专门介绍用户界面及其与域对象的关系。

令我困惑的一点是用例最优查询和演示者之间的比较。

处理最佳查询的摘录(第517页)是:

您可以改为使用所谓的用例最优查询,而不是读取各种类型的多个整个聚合实例,然后以编程方式将它们组合到单个容器(DTO或DPO)中。
在这里,您可以使用finder查询方法设计Repository,该方法将自定义对象组合为一个或多个Aggregate实例的超集。
该查询动态地将结果放入值对象(6)中,该对象专门用于满足用例的需要。
您设计的是值对象,而不是DTO,因为查询是特定于域的,而不是特定于应用程序(如DTO)。 然后,视图渲染器直接使用自定义用例最佳值对象。

因此,最佳查询的好处是直接提供特定视图值对象,充当真实视图模型。

稍后页面描述了演示者模式:

演示模型充当适配器。 它通过提供根据视图需求设计的属性和行为来掩盖域模型的详细信息。
而不是要求域模型专门支持必要的视图属性,表示模型的责任是从域模型的状态派生特定于视图的指示符和属性。

听起来两种方式都可以构建一个特定于用例的视图模型。

目前我的调用链(使用Play Framework)如下所示:

对于查询:控制器(充当发送Json的Rest接口) - >查询(通过最佳查询返回特定值对象)

对于命令:控制器(充当发送Json的Rest接口) - >应用程序服务(命令) - >域服务/存储库/聚合(应用程序服务返回void)

我的问题是:如果我已经练习了用例最优查询,那么实现presenter模式有什么好处? 如果可以始终使用最佳查询来直接满足客户需求,为什么还要使用演示者呢?

我只想到演示者模式的一个好处:处理命令而不是查询,从而提供命令对应于演示者确定的视图模型的一些域对象。 然后,控制器将与域对象分离。 实际上,Presenter描述的另一个摘录是:

此外,演示模型会跟踪用户执行的编辑。
这不是将重载责任放在Presentation Model上的情况,因为它意味着要在两个方向上进行调整,模型要查看和查看模型。

但是,我更喜欢将纯原语发送到应用程序服务(命令),而不是直接处理域对象,因此这种好处不适用于我。
任何解释?

只是一个猜测:)

preseneter模式可以尽可能地重用您的存储库的聚合查找器方法。 例如,我们有两个视图,在这种情况下我们需要两个适配器(每个视图一个适配器),但我们只需要一个存储库查找方法:

class CommentBriefViewAdapter {
    private Comment comment;

    public String getTitle() {
         return partOf(comment.getTitle()); 
         //return first 10 characters of the title, hide the rest
    } 
    .....//other fields to display
}

class CommentDetailViewAdapter {
    private Comment comment;

    public String getTitle() {
         return comment.getTitle();//return full title
    } 
    .....//other fields to display
}

//In controller:
model.addAttribute(new CommentBriefViewAdapter(commentRepo.findBy(commentId)));
// same repo method
model.addAttribute(new CommentDetailViewAdapter(commentRepo.findBy(commentId)));

但最佳查询是面向视图的(每个视图的查询)。 我认为这两种解决方案都是针对非cqrs风格的ddd架构而设计的。 由于查询不是基于存储库而是基于特定的瘦数据层,因此不再需要cqrs样式的结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM