我有一个控制器。 “OrderController”。目前它是1800线。我喜欢减小尺寸。我正在使用静态帮助器方法,但是我正在使用ninject来调用我的存储库,因此在没有传递属性的情况下无法访问静态方法中的存储库。
有哪些降低控制器噪音的好方法?
答案 0 :(得分:9)
重构可重用的功能,可以应用于ActionFilters
的多种类型的输出。 结果:重复性较低的代码,较薄的控制器操作,更快的未来发展
重构适用于特定类型输出的自定义ActionResult
的可重用功能。 结果:重复性较低的代码,较薄的控制器操作,更快的未来发展
利用ModelBinders
将输入值绑定到注入Controller
操作的复杂对象。 结果:您无需在控制器中处理实际的HTTP输入(RouteData,Form值,查询字符串参数)。您还可以在模型绑定器中处理数据验证。
通过自定义ControllerFactory
实施依赖注入。 后果:您无需在Controller中构建服务。
将具有过多Controller控制器操作的单个控制器重构为多个控制器。 后果:您的代码变得更易于维护。
将静态辅助方法移动到静态类。 结果:您的方法可以被多个控制器重复使用,并且您在控制器中的代码更少,因此更容易维护和更改您的应用。
存在大量开源资源来帮助完成这些任务。我绝对建议调查MvcContrib项目。它们具有FluentController
基类,其设计时考虑了构建精简控制器。另外,我赞成Darin因为他推荐的视频很有用,所以请查看
答案 1 :(得分:1)
你的控制器中不应该有那么多代码。我怀疑你没有把你的担忧分开。
我会对这个问题的答案进行审视和思考:
简而言之:
将复杂性放入执行明确目的的服务类中,即提供控制器所需的功能。
控制器应该只有应用程序逻辑,即它应该只是作为一种空中交通,嗯,控制器,以这种方式发送请求和基于应用程序逻辑。简而言之,这几乎就是它的功能。其他东西不属于控制器。
我的控制器看起来像:
[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);
}
}
注意控制器构造函数中的服务实例化以及操作中对服务的调用。
答案 2 :(得分:0)
1800行!!!!!!!!!神的圣洁母亲。我建议你看看following video关于控制饮食的问题。