- CQS 原则 ( https://en.wikipedia.org/wiki/Command%E2%80%93query_separation ) 规定命令应返回 void。
- 异步方法的建议是永远不要返回 void ( https://msdn.microsoft.com/en-us/magazine/jj991977.aspx ),而是返回一个任务。
那么,如果我编写一个异步命令,是否会不可避免地破坏 CQS 原则?
那么,如果我编写一个异步命令,是否会不可避免地破坏 CQS 原则?
在处理 async 时Task
表示 void 并Task<T>
表示“结果”。所以不,它不违反 CQS,您只需将其Task
视为void
.
在考虑您想知道什么(查询)或做什么(命令)的层面上,然后Task<T>
为您提供数据,因此对于查询是正确的,而Task
不是因此对于命令是正确的。(“return void”是某些语言表达“不返回数据”的特定语言方式)。
在下面的级别,您正在考虑管理异步操作的机制,那么您总是希望获得有关异步操作状态的信息,因此总是需要某种任务对象。这不是考虑命令-查询分离的级别。
类似地,如果 .NET 方法调用 COM 方法,它将调用始终返回指示成功或失败的值的代码。这只是该特定技术中异常处理如何发生的一个实现细节。根据您的工作水平考虑这一点是至关重要的还是无关紧要的。Task
是基于任务的异步编程如何工作的实现细节。根据您的工作水平考虑这一点是至关重要的还是无关紧要的。
您需要考虑“这是命令还是查询”的级别,Task
是有关如何获得的实现细节void
。
从您链接的文章中:
当从同步代码转换为异步代码时,任何返回类型 T 的方法都将成为异步方法返回
Task<T>
,任何返回 void 的方法都将成为异步方法返回 Task。
因此,返回Task
(not Task<T>
) 转化为有一个方法返回 void
。