最好在MVC中拥有巨大的控制器或许多控制器?

Bee*_*eep 66 architecture model-view-controller asp.net-mvc

我们正在ASP.NET MVC中构建一个相当大的HR应用程序,到目前为止我们的控制器变得非常庞大.例如,我们有一个Employee控制器,包括所有员工视图(个人信息,员工扣除,家属等).这些视图中的每一个都可能有多个动作或子视图(例如CRUD).每个动作都相对较小,但控制器可能有许多功能.

是否存在拆分控制器的最佳实践?而不是拥有带有几十个视图的Employee控制器,对每个子类型(即EmployeePersonalInfoController,EmployeeDeductionController,EmployeeDependentController)是否更好一个控制器?

最后,它甚至重要吗?

更新澄清

我最初担心的是CRUD的行为.例如,让我们考虑创建和删除...

EmployeeController中的当前操作:

  CreateEmployee()
  DeleteEmployee()
  CreateEmployeeDeduction()
  DeleteEmployeeDeduction()
  CreateDependent()
  DeleteDependent()
  etc.
Run Code Online (Sandbox Code Playgroud)

如果控制器被拆分:

  EmployeeController
    Create()
    Delete()
  EmployeeDeductionController
    Create()
    Delete()
  EmployeeDependentController
    Create()
    Delete()
  EmployeeBenefitController
    Create()
    Delete()
  etc.
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我们的~100个屏幕被分成8-10个大型控制器.在第二个,我可能有~50个控制器.

Sam*_*sel 28

部分类允许您跨多个文件传播您的类.这样,您可以将控制器的相关区域分组到单独的文件中,但它们仍然是同一控制器的一部分.例如

EmployeeDeductionController.cs

public partial class EmployeeController
{
    public ActionResult Deduct()
    {
    }
    // etc
}
Run Code Online (Sandbox Code Playgroud)

EmployeeBenefitController.cs

public partial class EmployeeController
{
    public ActionResult GiveBenefit()
    {
    }
    // etc
}
Run Code Online (Sandbox Code Playgroud)

  • 一个有趣的想法,但我认为它略微滥用了部分类功能.部分类主要是为代码生成场景设计的,因此开发人员可以添加到生成的类中,并在重新生成期间保留这些更改.除非我误解,否则我认为使用共享基类创建单独的控制器比使用部分更好. (18认同)
  • 自从发布我的答案后,我实际上完全同意你的Seth.部分课程过去一直困扰着我,现在我一般都会避开它们.哦,我是多么善变. (11认同)
  • 很好的想法...但出于好奇,这比将控制器分成多个控制器更有益吗? (4认同)
  • 这可以很好地工作,这是我为什么要费心使用部分类的唯一原因。 (2认同)
  • @SamWessel 您具体遇到了哪些问题? (2认同)

gri*_*egs 14

在我看来,如果你将控制器中的代码保留下来,那么这并不重要.

你的大部分代码都会在某个商业层发生吗?如果是这种情况,那么你在控制器中真正做的就是将数据返回到视图中.应该如此.

不确定我是否是将控制器分成子类型的粉丝.虽然你应该保持关注的分离,我认为亚型有点太过分了.

你可以看看这篇文章,看看它是否有帮助. 相同的视图不同的路径

这可能是比使用您建议的子类型方法更好的解决方案.


Mat*_*s F 10

我不想要50个控制器.现在我的应用程序中有16个,感觉还可以.如果您有50个控制器,您还将拥有50个顶级文件夹以供查看.很难找到您需要处理的视图和控制器.正如其他人所提到的那样,行动通常很短,而且在你的控制器中有一些行动并不是那么糟糕.

我尝试按系统部分安装1个控制器.我通过采用我的数据库模式并围绕属于一起的表绘制一条线来定义系统部件.