Действия CQS и ASP.NET MVC - PullRequest
       28

Действия CQS и ASP.NET MVC

1 голос
/ 02 августа 2010

Те, кто читал о принципе CQS, знают, что:

CQS утверждает, что каждый метод должен либо команда, которая выполняет действие или запрос, который возвращает данные звонящему, но не обоим.

Говоря о действиях ASP.NET MVC, указывает ли CQS, что у нас не должно быть таких действий?

public PartialView InsertOrder(Order order)
{
       OrderService.InsertOrder(order);
       return PartialView("OrderDetails", order);
}

Этот метод изменяет состояние системы и возвращает текущее состояние. Если здесь применяется CQS, у нас должно быть 2 отдельных Действия: одно для вставки нового ордера и одно для получения системы системы (которая должна вызываться из клиента, если первое действие было успешно выполнено). Однако это усложняет программирование.

Мне бы хотелось узнать ваше мнение по этому поводу.

Мош

Ответы [ 4 ]

6 голосов
/ 02 августа 2010

Типичным примером разделения команд / запросов в Интернете является Post / Redirect / Get .

В ASP.NET MVC это обычно реализуется самым простым способом:

[HttpPost]
public ActionResult UpdateOrder(Order order){
  UpdateOrder(order);
  return RedirectToAction("ViewOrder", new { order.OrderId });
}

[HttpGet]
public ActionResult ViewOrder(int orderId){
  return View(GetOrder(orderId));
}

Для AJAX и частичного представления это может не быть лучшимстратегии, поскольку проблемы, которые решает Post / Redirect / Get, на самом деле не актуальны, и перенаправление может быть сложным.

2 голосов
/ 03 мая 2011

CQS касается только команд и запросов к одному и тому же объекту. Поскольку OrderView и Order не являются одним и тем же объектом (я полагаю из вашей реализации), этот принцип не применяется, поэтому ваш код не противоречит принципу ни в пользу :)

1 голос
/ 02 августа 2010

Я никогда не слышал о CQS, но если вы выполняете ASP.NET MVC (шаблон MVC), то написанное вами действие совершенно нормально (при условии, что OrderService - абстракция к реальному сервису). Контроллер манипулирует моделью и решает, какое представление визуализировать, и передает эту модель в представление.

0 голосов
/ 02 августа 2010

У меня было смутное воспоминание об этом термине из эйфелевых дней (которые, если их придерживаться весь путь назад, на самом деле предшествуют большинству текущих принципов ООП на хорошее десятилетие или около того (я думаю, что в конце 80-х). Я бы предложил этот термини / или принцип вполне может быть устаревшим и заменен результатами действия в mvc (будь то asp или codeignitor и т. д. и т. д.). Я действительно считаю, что с точки зрения определения (которое я только что посмотрел сейчас), это разделение связано слогика, которая выполняет действие, например, OrderService.InsertOrder(order) в вашем примере. Таким образом, mvc, выполняемый в вашем действии, на самом деле выглядит ленивее, следуя этому шаблону (InsertOrder не пытается представить какую-либо информацию о состоянии, просто обрабатывает объект заказа).

Я бы посоветовал вам взглянуть на лучшую практику для asp.net mvc, которая основана на возвращении результата действия (или частичного, содержимого и т. Д. И т. Д.). Этот шаблон был разработан, чтобы упростить парадигму для повышения производительности.в единой и общепринятой форме.

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

надеюсь, это поможет

Джим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...