6

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

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

4

3 回答 3

11

如何获得瘦控制器

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

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

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

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

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

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

其他注意事项

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

于 2011-03-04T12:35:19.517 回答
1

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

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

ASP.NET MVC 模式

简而言之:

  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);
        }
    }

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

于 2011-03-04T12:36:05.127 回答
0

1800行!!!!!!!!!神的圣洁母亲。我建议您观看以下有关节食控制器的视频。

于 2011-03-04T11:56:30.717 回答