0

在 CQS(命令查询分离)中,通常有带有“void”返回值的命令和带有返回类型的查询。(或者我已经学会了......)

现在我想知道这个命令是否有效,因为基本上,我们正在做与查询相同的事情,只是使用“out”关键字而不是使用返回类型:

public class LogTrace{
    public Guid CorrelationId { get; }
    public DateTime Timestamp { get; }
}

public class Logger{
    public void Log(string message, out LogTrace trace){
        trace = new LogTrace(){//Fill properties};
        //Log the message (+ trace)
    }
}
4

2 回答 2

2

CQS 不是关于“没有返回类型”,而是关于不让查询更改数据或命令返回状态 - 它没有规定任何关于如何或何时使用语言构造的内容,因为它是一个与语言无关的概念。

无论您是通过显式返回值还是通过使用out参数隐式从命令返回数据,这实际上并不重要;你仍然违反同样的原则。

如果有的话,使用out糟糕:您不仅违反了原则,而且还通过尝试用技术来破坏自己,从而给代码增加了不必要的复杂性。如果你真的需要返回一个值,你应该为它使用一个合适的返回值。

我还会质疑您为什么要尝试遵循显然不适合您尝试做的架构模式(或进一步分析是什么让您认为您需要返回一个值并解决该潜在问题,具体取决于您的看法)。

于 2016-07-06T13:07:31.437 回答
0

通常,当您执行 CQS 时,您通常具有 ICommandHander<> 和 IQueryHandler<>,因此您可以添加装饰器并实现一些非常强大的横切关注点。我更进一步,创建了一个 ICommandQueryHandler<>。有灰色区域,比如堆栈/队列,在哪里获取数据,你必须先改变它。因此,最好尽可能地遵循标准,但只要准备好一些东西,当所有其他选项都不起作用时,你只能作为最后的手段使用——然后每次都使用它来保持一致。

于 2018-01-09T21:29:38.580 回答