【问题标题】:keeping asp.net mvc controller size down减小 asp.net mvc 控制器的大小
【发布时间】:2011-03-04 11:53:41
【问题描述】:

我有一个控制器。 “订单控制器”。目前是1800行。我喜欢缩小尺寸。我正在使用静态辅助方法,这很好,但我使用 ninject 来调用我的存储库,因此如果不传入属性,就无法访​​问静态方法中的存储库。

有哪些降低控制器噪音的好方法?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 asp.net-mvc-4 asp.net-mvc-controller


    【解决方案1】:

    如何获得瘦控制器

    1. 将可应用于多种类型输出的可重用功能重构为ActionFilters结果: 更少的重复代码,更精简的控制器动作,更快的未来开发

    2. 将适用于特定类型输出的可重用功能重构为自定义ActionResult结果: 更少的重复代码,更精简的控制器动作,更快的未来开发

    3. 利用 ModelBinders 将您的输入值绑定到注入到您的 Controller 操作中的复杂对象。 后果:您根本不需要在控制器中处理实际的 HTTP 输入(RouteData、Form 值、查询字符串参数)。您还可以在模型绑定器中处理数据验证。

    4. 通过自定义 ControllerFactory 实现依赖注入。 后果:您无需在 Controller 中构建服务。

    5. 将具有过多控制器操作的单个控制器重构为多个控制器。 后果:您的代码变得更易于维护。

    6. 将静态辅助方法移至静态类。 后果:您的方法可以被多个控制器重用,并且控制器中的臃肿代码更少,因此更易于维护和更改您的应用。

    其他说明

    存在大量开源资源来帮助完成这些任务。我绝对建议研究 MvcContrib 项目。他们有一个FluentController 基类,设计时考虑到构建瘦控制器。另外,我赞成 Darin,因为他推荐的视频很有帮助,所以请查看

    【讨论】:

      【解决方案2】:

      控制器中不应该有那么多代码。我怀疑你没有分开你的顾虑。

      我想看看这个 SO 问题的答案:

      ASP.NET MVC Patterns

      简而言之:

      1. 将复杂性放入执行明确目的的服务类中,即交付控制器所需的内容。

      2. 控制器应该只有应用程序逻辑,即它应该只是充当一种空中交通,嗯,控制器,以这种方式和基于应用程序逻辑的方式发送请求。简而言之,这就是它的功能。其他东西不属于控制器。

      我的控制器看起来像:

      [Authorize(Roles="Admin, Tutor, Pupil")]
      public partial class CourseController : Controller
      {
          ICourseDisplayService service;
          public CourseController(ICourseDisplayService service)
          {
              this.service = service;
          }
      
          public virtual ActionResult Browse(int CourseId, string PupilName, string TutorName)
          {
              service.Initialize(CourseId, 1, PupilName, TutorName, User);
              service.CurrentStepOrder = service.ActiveStepIndex;
              if (Request.IsAjaxRequest())
              {
                  return PartialView(MVC.Courses.Course.Views._Display, service.ViewModel);
              }
              else
              {
                  return View(MVC.Courses.Course.Views.Display, service.ViewModel);
              }
          }
      

      注意控制器构造函数中的服务实例化和操作中对服务的调用。

      【讨论】:

      • 您的服务直接公开视图模型?似乎不是一个好的设计的好例子。我宁愿在我的控制器中放置一些映射代码,也不愿拥有一个不仅包含特定于应用程序而且包含特定于 view 代码的服务。
      【解决方案3】:

      1800 行!!!!!!!!!神的圣洁母亲。我建议您观看 following video 关于让控制器节食的内容。

      【讨论】:

      • 4000 怎么样。对于在大/中型开发人员团队工作过的任何人来说,这都不算什么。当开发人员不了解基本架构时,某些热点会很快积累膨胀。
      • @Darin:您好,您能否修复链接和/或提供会话名称?
      • @Darin:我对答案投了反对票,因为链接不起作用,也无助于提供答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2011-02-21
      • 2018-05-15
      • 1970-01-01
      相关资源
      最近更新 更多