2016-07-06 7 views
0

В CQS (Разделение командного запроса) обычно имеют команды с возвращаемым значением «void» и запросами с типом возврата. (или так я узнал ...)CQS с параметром 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) 
    } 
} 
+1

Основываясь на вашем коде, это может быть действительно, но не очень хорошая практика. Используйте 'out'-keyword, если метод возвращает более одного значения. У вас не будет никаких преимуществ, реализующих его таким образом – lokusking

ответ

1

ОКК не о «не имеющих возвращаемых типах», но о том, не имеющие запросы изменить данные или команды возвращают состояние - это ничего не предписывает о том, как и когда вы должны использовать конструкции языка, потому что это язык -агностическая концепция.

Если вы возвращаете данные из своей команды через явное возвращаемое значение или неявно с использованием параметров out, это действительно несущественно; вы по-прежнему нарушаете тот же принцип.

Если что-нибудь, используя out является хуже: вы не только нарушают принцип, но вы также добавить ненужную сложность кода, пытаясь подорвать себя формальность. Если вам действительно нужно вернуть значение, вы должны использовать для него правильное возвращаемое значение.

Я также сомневаюсь, почему вы пытаетесь соответствовать архитектурным шаблонам, которые, по-видимому, не соответствуют тому, что вы пытаетесь сделать (или дополнительно проанализируйте, что заставляет вас думать, что вам нужно вернуть значение и адрес, лежащий в основе проблемы , в зависимости от вашей перспективы).

0

Обычно, когда вы делаете CQS, у вас обычно есть ICommandHander <> и IQueryHandler <>, чтобы вы могли добавить декораторов и получить действительно мощные сквозные проблемы. Я сделал еще один шаг и создал ICommandQueryHandler <>. Есть серые области, такие как Stacks/Queues, где для получения данных вы должны сначала изменить его. Таким образом, лучше следовать стандарту, насколько это возможно, но просто иметь что-то на своем месте, которое вы используете только в качестве последнего средства, когда все остальные параметры не будут работать, а затем использовать это каждый раз, чтобы быть последовательным.