ASP.NET MVC使控制器保持轻盈
本文关键字:控制器 NET MVC ASP | 更新日期: 2023-09-27 18:30:00
所以我反复被告知要保持控制器的精简。现在我想知道我的控制器是不是太薄了?
现在,我的控制器依靠异常将错误从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);
}
}
}
My 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");
}
}
对控制流使用异常不是一个好主意。异常不应用于将一个值从一个层(可以是一种方法)返回到另一层以确定协同控制流。异常应用于处理意外情况,如数据库错误/网络错误/由于意外事件导致的代码崩溃等。
您可以使用一个简单的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类型Data属性来改进这一点。你也可以为你的错误创建一个以太坊并使用它。
现在回到您最初的问题,是的,不要将所有代码都放在控制器操作方法中您不仅应该保持精简的控制器,而且应该尽可能精简每个类/层不要忘记单一责任原则:)