【问题标题】:CQS with out parameter没有参数的 CQS
【发布时间】:2016-07-06 09:05:39
【问题描述】:

在 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)
    }
}

【问题讨论】:

  • 根据您的代码示例,它可能是有效的,但不是好的做法。如果方法返回多个值,则应使用out-keyword。以这种方式实施它不会有任何好处

标签: c# out command-query-separation


【解决方案1】:

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

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

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

我还质疑您为什么要尝试遵循显然不符合您正在尝试做的事情的架构模式(或者进一步分析是什么让您认为您需要返回一个值并解决该潜在问题,取决于你的观点)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2019-05-25
      • 1970-01-01
      • 2018-08-19
      相关资源
      最近更新 更多