我想知道在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 { }
哪个最好?
答案 0 :(得分:1)
好吧,如果单独的查询类型会导致类的爆炸,我猜你可以尝试找到更通用的方法。
很难确切告诉您应该如何完成,但在查询处理程序中包含if
语句可能不正确。如果您要引入新的查询,例如PipeDiameterQuery
,它会违反Open-closed principle并导致大量的代码重复。
你可以做的是有一个类,它封装了每种类型管道的统计读取模型的实际模式,并使你的查询处理程序能够处理这些模式。
客户端会传递他想要统计的管道类型,查询处理程序可能看起来像(伪代码):
schema = PipeStatisticalSchema.fromPipeType(clientSuppliedPipeType);
SELECT SUM(Length) FROM schema.Table
最好是,如果schema
在到达查询处理程序之前就已经解决了,那就很好了,这样它就会被注入其中。
答案 1 :(得分:0)
如果所有这些数据都应在一个视图中表示,则创建一个查询,否则将其分开。