ASP.NET MVC保持控制器轻盈

时间:2016-01-12 23:48:55

标签: c# asp.net-mvc

所以我一再被告知让我的控制器变薄。现在我想知道我的控制器是否太薄了?

现在我的控制器依赖异常来将错误从BLL传递到View。我不确定为什么这是错的,但关于它的事情并不合适。

我下面会包含一些伪代码,希望有人能提出更好的方法吗?

非常感谢任何帮助!

我的控制器:

        [HttpPost]
        [ValidateAntiForgeryToken]
        [Authorize(Roles = KitchenRoles.Chefs)]
        public ActionResult Cook(PizzaVm pizzaVm, HttpPostedFileBase pictureFileBase)
        {
            if (ModelState.IsValid)
            {

                try
                {
                    BLL.Pizza.Cook(pizzaVm, pictureFileBase);
                }
                 catch (Exception ex) when (ex is PizzaBurntException || ex is NoOlivesException)
                {
                    @ViewBag.errormessage = ex.Message;
                    return View(pizzaVm);
                }
                catch (Exception ex) when (ex is PizzaNotFoundException)
                {
                    ModelState.AddModelError("PizzaName", ex.message);

                    return View(pizzaVm);
                }
            }

            } 

我的BLL.Pizza.Cook()方法:

public static void Cook(PizzaVm pizzaVm, HttpPostedFileBase pictureFileBase)
        {

            if (!BLL.Pizza.NameExists(pizzaVm.name))
            {
                throw new PizzaNotFoundException("Pizza not found");
            }

            try
            {
                placeInOven(pizzaVm);
            }
            catch (Exception)
            {

                throw new PizzaBurntException("It's burnt");
            }


        }

1 个答案:

答案 0 :(得分:1)

对控制流使用异常不是一个好主意。异常不应该用于将值从一个层(可能是方法)返回到另一个层以确定cotntrol流。应该使用异常来处理意外情况,例如由于意外事件导致的db错误/网络错误/代码崩溃等。

您可以使用简单的POCO数据结构从表单/图层返回值。

public class TransactionResult
{
  public bool IsSuccess {set;get;}
  public string Message {set;get;}
  public string ErrorCode {set;get;}
}

然后从方法/图层返回此对象。

public TransactionResult Cook(PizzDto pizza)
{
   if (!BLL.Pizza.NameExists(pizza.name))
   {
     return new TransactionResult { ErrorCode= "NameExists"};
   }
   BLL.Pizza.KeepInOven(pizza);
   return new TransactionResult { IsSuccess = true };   
}

无论是谁调用它都会检查返回值的IsSuccess属性并使用它来确定控制流。

这只是入门的基本解决方案。如果您想传递一些数据,可以通过添加通用T类型数据属性来改善这一点。您也可以为错误创建一个eum并使用它。

现在回到原来的问题,是的,不要将所有代码都放在控制器操作方法中。 控制器不仅应该保持薄,而且应该尽可能保持每个类/层。不要忘记单一责任原则:)