所以我一再被告知让我的控制器变薄。现在我想知道我的控制器是否太薄了?
现在我的控制器依赖异常来将错误从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");
}
}
答案 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并使用它。
现在回到原来的问题,是的,不要将所有代码都放在控制器操作方法中。 控制器不仅应该保持薄,而且应该尽可能保持每个类/层。不要忘记单一责任原则:)