【问题标题】:Is important Repeat yourself rule for CQRS对 CQRS 重复自己的规则很重要
【发布时间】:2015-03-05 06:56:01
【问题描述】:

我想知道在 CQRS 上使用名为 DRY(不要重复自己)的设计原则规则。

我有 2 种几何表,名为 WaterPipes,GasPipes。

public GasPipe{ id, Name, Length, .... }
public WaterPipe{ id, Name, Length .... }

所以我是使用 CQRS 的新手。我想创建一个查询来获取它们的总长度。

数据库查询将类似。

Select Sum(Length) From GasPipes, 
Select Sum(Length) From WaterPipes

那么现在我可以创建一个查询吗?

public class PipeLengthQuery { }
public class PipeLengthQueryHandler {
    if(water) Select Sum(Length) From WaterPipes
    if(gaz) Select Sum(Length) From GasPipes
}

或单独的查询类型:

public class WaterPipeLengthQuery { }
public class GasPipeLengthQuery { }
public class GasPipeLengthQueryHandler { }
public class WaterPipeLengthQueryHandler { }

哪个最好?

【问题讨论】:

  • 恐怕这是一个偏好问题。两者都没有比另一个更好或更差:)

标签: .net design-patterns domain-driven-design cqrs


【解决方案1】:

好吧,如果单独的查询类型会导致类的爆炸式增长,我想您可以尝试找到更通用的方法。

很难确切地告诉您应该如何完成,但是在查询处理程序中使用if 语句可能是不正确的。它违反了Open-closed principle,如果您要引入新的查询,例如PipeDiameterQuery,会导致大量代码重复。

您可以做的是有一个类来封装每种管道类型的统计读取模型的实际架构,并让您的查询处理程序处理这些架构。

客户端将传递他想要统计的管道类型以及查询处理程序的样子(伪代码):

schema = PipeStatisticalSchema.fromPipeType(clientSuppliedPipeType);

SELECT SUM(Length) FROM schema.Table

如果schema 在到达查询处理程序之前就已经被解析,那就更好了,这样它就可以被注入其中。

【讨论】:

    【解决方案2】:

    如果所有这些数据都应该在一个视图中表示,则创建一个查询,否则将其分开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多