重要的是重复自己的CQRS规则

时间:2015-03-05 06:56:01

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

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

我有两种名为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 { }

哪个最好?

2 个答案:

答案 0 :(得分:1)

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

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

你可以做的是有一个类,它封装了每种类型管道的统计读取模型的实际模式,并使你的查询处理程序能够处理这些模式。

客户端会传递他想要统计的管道类型,查询处理程序可能看起来像(伪代码):

schema = PipeStatisticalSchema.fromPipeType(clientSuppliedPipeType);

SELECT SUM(Length) FROM schema.Table

最好是,如果schema在到达查询处理程序之前就已经解决了,那就很好了,这样它就会被注入其中。

答案 1 :(得分:0)

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