6

那么,如果我编写一个异步命令,是否会不可避免地破坏 CQS 原则?

4

3 回答 3

9

在处理 async 时Task表示 void 并Task<T>表示“结果”。所以不,它不违反 CQS,您只需将其Task视为void.

于 2015-11-23T15:03:21.850 回答
6

在考虑您想知道什么(查询)或做什么(命令)的层面上,然后Task<T>为您提供数据,因此对于查询是正确的,而Task不是因此对于命令是正确的。(“return void”是某些语言表达“不返回数据”的特定语言方式)。

在下面的级别,您正在考虑管理异步操作的机制,那么您总是希望获得有关异步操作状态的信息,因此总是需要某种任务对象。这不是考虑命令-查询分离的级别。

类似地,如果 .NET 方法调用 COM 方法,它将调用始终返回指示成功或失败的值的代码。这只是该特定技术中异常处理如何发生的一个实现细节。根据您的工作水平考虑这一点是至关重要的还是无关紧要的。Task是基于任务的异步编程如何工作的实现细节。根据您的工作水平考虑这一点是至关重要的还是无关紧要的。

您需要考虑“这是命令还是查询”的级别,Task是有关如何获得的实现细节void

于 2015-11-23T15:23:31.783 回答
3

从您链接的文章中:

当从同步代码转换为异步代码时,任何返回类型 T 的方法都将成为异步方法返回Task<T>,任何返回 void 的方法都将成为异步方法返回 Task。

因此,返回Task(not Task<T>) 转化为有一个方法返回 void

于 2015-11-23T15:12:00.437 回答