2015-03-05 3 views
3

Мне интересно использовать правило принципа проектирования, которое по умолчанию называется DRY (не повторяйте себя) на CQRS.Важно Повторить правило для CQRS

У меня есть 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 { } 

Какой из него лучше всего?

+0

Я боюсь, что это вопрос предпочтения. Ничего лучше или хуже другого :) –

ответ

0

Если все эти данные должны быть представлены в одном представлении, тогда создайте один запрос, иначе его разделите.

1

Ну, если отдельные типы запросов приведут к взрыву классов, я думаю, вы могли бы попытаться найти более общий способ.

Трудно сказать вам, как это должно быть сделано, но наличие операторов if в обработчиках запросов, вероятно, неверно. Он нарушает Open-closed principle и приведет к большому дублированию кода, если вы представите новые запросы, например PipeDiameterQuery.

Что вы можете сделать, это иметь класс, который инкапсулирует фактическую схему вашей статистической модели чтения для каждого типа трубы и обработчики запросов работают с этими схемами.

Клиент будет проходить какой тип трубы он хочет статистику и обработчик запросов мог бы выглядеть (псевдо-код):

schema = PipeStatisticalSchema.fromPipeType(clientSuppliedPipeType); 

SELECT SUM(Length) FROM schema.Table 

Предпочтительно, было бы неплохо, если бы schema будет решен уже до достигая обработчика запросов, так что он просто вводится в него.

Смежные вопросы