【发布时间】:2018-06-08 00:43:15
【问题描述】:
我最近在这里阅读这篇文章:https://cuttingedge.it/blogs/steven/pivot/entry.php?id=100。它似乎在谈论使用命令 (http://www.dofactory.com/net/command-design-pattern) 而不是应用程序服务。
请看下面的代码:
public sealed class ShipmentController
{
private readonly ICommandDispatcher dispatcher;
public void ShipOrder(ShipOrder cmd) => dispatcher.Dispatch(cmd);
}
sealed class CommandDispatcher : ICommandDispatcher
{
private readonly Container container;
public void Dispatch(dynamic cmd) => GetHandler(cmd.GetType()).Handle(cmd);
private dynamic GetHandler(Type type) =>
container.GetInstance(typeof(ICommandHandler<>).MakeGenericType(type));
}
替换如下代码:http://www.zankavtaskin.com/2013/11/applied-domain-driven-design-ddd-part-6.html
我有三个问题:
1) 这是否是说应用服务层中的每个命令请求都应该有一个命令?这不会导致班级爆炸,例如如果你有 100 个命令?
2) 您如何处理 CQRS 查询?您是否为这些创建常规应用程序服务?
3) 你如何处理从数据库中提取的场景(比如订单);对订单执行命令,例如CalculateTax 然后持久化到数据库?我假设流程是(对吗):
MVC
Application Service (to extract order from database)
Command (Application Service calls CalculateTaxCommand)
【问题讨论】:
-
1) No. Http 请求和
command request是两个完全不同的东西。是的,对于command request,您至少有 3 个类:command、handler和response。 2) 不。你和commands 有同样的原则,除了查询是幂等的(他们不能修改任何东西)。这意味着您可能需要封装您的数据库访问权限,以便没有人可以编写修改某些内容的查询 3)您将:a)发送查询 b)执行命令到calculatetaxc)执行命令以更新数据库跨度> -
@zaitsman,你能确认每个查询/命令都封装在自己的类中吗?
-
这是一个理论 :) 所以是的,它应该是唯一能保证分离水平的东西。 DDD 和 CQRS 的全部意义在于它允许将您的应用程序分解为几行孤立的代码,这在 20 多名开发人员和数千个操作的团队中更容易重构。通常所有的命令、查询和处理程序都继承一些接口或基类。另请查看 MediatR (github.com/jbogard/MediatR)
-
这只是一个 c# 问题吗?
-
@zaitsman 幂等并不意味着他们不能修改任何东西,这意味着一个函数可以多次执行但第一次执行后结果不会改变。