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