带参数的CQS

时间:2016-07-06 09:05:39

标签: c# out command-query-separation

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

2 个答案:

答案 0 :(得分:1)

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

无论是通过显式返回值从命令返回数据还是通过使用out参数隐式返回数据都是无关紧要的;你仍然违反了同样的原则。

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

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

答案 1 :(得分:0)

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