控制器不应具有域逻辑。一个人应该如何忠实于这个宗旨?

时间:2011-01-17 14:48:04

标签: asp.net-mvc asp.net-mvc-2

从Pro ASP.NET MVC书籍的第49页引用

  

当然可以放置域名   逻辑到控制器,即使   你不应该,因为它似乎   无论如何它会起作用。这很容易   如果你想象你,请避免这种情况   有多种UI技术(例如,   一个ASP.NET MVC应用程序加上一个   本机iPhone应用程序)运行   在相同的基础业务领域   层(也许有一天你会!)。   考虑到这一点,你很清楚   不想把域逻辑放进去   任何UI图层。

为什么他似乎在第172页上反驳自己?

[HttpPost]
public ActionResult CheckOut(Cart cart, ShippingDetails shippingDetails)
{
    // Empty carts can't be checked out
    if (cart.Lines.Count == 0)
        ModelState.AddModelError("Cart", "Sorry, your cart is empty!");

    if (ModelState.IsValid)
    {
        orderSubmitter.SubmitOrder(cart, shippingDetails);
        cart.Clear();
        return View("Completed");
    }
    else // Something was invalid
        return View(shippingDetails);
}

相关:How to avoid placing domain logic in controller?

1 个答案:

答案 0 :(得分:1)

if (cart.Lines.Count == 0)测试确实可以由模型的验证逻辑处理,不应该放在控制器中。就个人而言,我会像这样重写这个控制器动作:

[HttpPost]
public ActionResult CheckOut(CheckOutViewModel checkOut)
{
    if (ModelState.IsValid)
    {
        orderSubmitter.SubmitOrder(checkOut);
        return View("Completed");
    }
    return View(checkOut);
}