Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Design patterns 什么';CQRS中的查询/命令对象点是什么?_Design Patterns_Crud_Cqrs - Fatal编程技术网

Design patterns 什么';CQRS中的查询/命令对象点是什么?

Design patterns 什么';CQRS中的查询/命令对象点是什么?,design-patterns,crud,cqrs,Design Patterns,Crud,Cqrs,有一个额外的传输对象有什么意义 为什么 cookingRecipeCommandHandler.Handle(new CreateCookingRecipeCommand(...)); 胜过 我很难理解这些附加对象的优点是什么 有一个额外的传输对象有什么意义 可重复使用的组成 cookingRecipeCommandHandler.Handle(new CreateCookingRecipeCommand(...)); 通常,上面的代码行会出现,因为我们有这样的代码 class Cook

有一个额外的传输对象有什么意义

为什么

cookingRecipeCommandHandler.Handle(new CreateCookingRecipeCommand(...)); 
胜过

我很难理解这些附加对象的优点是什么

有一个额外的传输对象有什么意义

可重复使用的组成

cookingRecipeCommandHandler.Handle(new CreateCookingRecipeCommand(...)); 
通常,上面的代码行会出现,因为我们有这样的代码

class CookingRecipeCommandHandler : Handles<CreateCookingRecipeCommand>
然后,除您的命令处理程序之外的其他东西可以实现相同的接口并链接在一起:

class Logging<T> : Handles<T> : where T:Command {
    Logging(Handles<T> next) { ... }

    void Handle(T command) {
        log(command)
        next.Handle(command)
    }
类日志记录:句柄:其中T:Command{
日志记录(处理下一个){…}
无效句柄(T命令){
日志(命令)
next.Handle(命令)
}
换句话说,通过设计所有专用的命令处理程序,使它们具有表面上相似的签名,它们都可以轻松地由一个或多个共享该公共签名的通用处理程序组成

见:格雷格·杨

有一个额外的传输对象有什么意义

可重复使用的组成

cookingRecipeCommandHandler.Handle(new CreateCookingRecipeCommand(...)); 
通常,上面的代码行会出现,因为我们有这样的代码

class CookingRecipeCommandHandler : Handles<CreateCookingRecipeCommand>
然后,除您的命令处理程序之外的其他东西可以实现相同的接口并链接在一起:

class Logging<T> : Handles<T> : where T:Command {
    Logging(Handles<T> next) { ... }

    void Handle(T command) {
        log(command)
        next.Handle(command)
    }
类日志记录:句柄:其中T:Command{
日志记录(处理下一个){…}
无效句柄(T命令){
日志(命令)
next.Handle(命令)
}
换句话说,通过设计所有专用的命令处理程序,使它们具有表面上相似的签名,它们都可以轻松地由一个或多个共享该公共签名的通用处理程序组成


请参阅:Greg Young。

如果没有命令/查询对象,应用程序通常是围绕每种实体类型的中心类设计的。我们有像
CookingRecipeService
(也称为管理器或处理程序)这样的服务类

它们负责与实体类型相关的一切

这很好。但随着应用程序的老化,它们获得了越来越多的功能,这意味着服务类会增长。它们的方法也会增长,因为使用私有方法解决小型子任务会使它们更难阅读

使用命令对象,您可以获得更清晰的设计,因为您通常有一个特定的类来解决特定的命令。这也会导致将任务划分为更小的子任务(即私有方法),从而使代码更易于阅读(因此也更易于维护)

在CQR中,我们讨论应用程序中的两个不同部分:更新对象状态的写入端(通过命令)和向UI提供信息的读取端


这种区别也很重要,因为UI很少只需要来自单个实体的信息。它通常需要复合信息(例如配方制造商的用户名、配方、评级、评论等)。服务/管理器类不适合于此,而查询处理程序可以专门用于聚合信息。

没有命令/查询对象,应用程序通常围绕每种实体类型的中心类设计。我们有类似于
CookingRecipeService
(也称为管理器或处理程序)的服务类

它们负责与实体类型相关的一切

这很好。但随着应用程序的老化,它们获得了越来越多的功能,这意味着服务类会增长。它们的方法也会增长,因为使用私有方法解决小型子任务会使它们更难阅读

使用命令对象,您可以获得更清晰的设计,因为您通常有一个特定的类来解决特定的命令。这也会导致将任务划分为更小的子任务(即私有方法),从而使代码更易于阅读(因此也更易于维护)

在CQR中,我们讨论应用程序中的两个不同部分:更新对象状态的写入端(通过命令)和向UI提供信息的读取端

这种区别也很重要,因为UI很少只需要来自单个实体的信息。它通常需要复合信息(例如配方制造商的用户名、配方、评级、评论等).service/manager类并不适合于此,而查询处理程序可以专门用于聚合信息