我有一个控制器根据用户类型加载一些下拉菜单.例如:
public ActionResult Index() { switch (SessionHelper.ViewLimit) { case "C": ViewData["CustDivision"] = LoadCustDivisions(); ViewData["Customer"] = LoadCustomers(); break; case "P": ViewData["Customer"] = LoadCustomers(); ViewData["Employee"] = LoadEmployees(); break; case "D": ViewData["Customer"] = LoadCustomers(); ViewData["Division"] = LoadDivisions(); break; default: return RedirectToAction("Logout", "Account"); } return View() }
首先,switch语句是否属于控制器,如果是,那么我应该在哪里放置LoadCustomers(),LoadDivisions(),LoadEmployees()?
我觉得没有 - 控制器中的私有方法会产生比他们解决的问题更多的问题.这是我的理由:
当您想要在控制器中创建私有方法时,您已经识别出一段代码,这些代码有点"潦倒"或重复.这是创建单独的帮助程序类或将代码向下移动的充分理由.
一个助手类,即使只有一个方法,也更容易测试和模拟.它还创造了一个更强大的逻辑分离关注点.这使得在调试时更容易处理.
我也同意tvanfosson使用策略模式来帮助不重新发明轮子并展示对软件开发的更成熟的理解.
但实际上,这是你可以争论两种永恒方式的情况之一.但它归结为你所瞄准的工艺水平,或更准确地说,愿意满足.
如果它们仅用于此控制器,我会说将它们保密为控制器是可以的.一旦您发现其他地方需要它们,那么请将它们迁移到DAL或帮助程序类.
您的体系结构的更大问题 - 使用switch语句或策略模式等 - 很难从这个片段中回答.我并没有特别被这个switch语句所冒犯,但您可能希望让SessionHelper返回一个策略,为您加载正确的视图数据.在这种情况下,加载视图的代码将放在策略类中.
DataStrategy strategy = SessionHelper.GetDataStrategy() if (strategy == null) { RedirectToAction("Logout","Account"); } strategy.LoadViewData( ViewData ); return View();