【发布时间】:2014-02-12 02:27:59
【问题描述】:
ASP MVC 5 有一个新的路由,称为属性路由。在我看来,路由现在分散在每个控制器上,这与基于约定的单一位置 RouteConfig.cs 不同,您可以在其中检查您的路由,这也以某种方式作为您站点路由的文档。
我的问题是在可读性和可维护性方面使用属性路由优于基于约定的路由吗?有人可以建议如何设计路线以获得更好的可维护性和可读性。
【问题讨论】:
标签: asp.net-mvc-routing asp.net-mvc-5
ASP MVC 5 有一个新的路由,称为属性路由。在我看来,路由现在分散在每个控制器上,这与基于约定的单一位置 RouteConfig.cs 不同,您可以在其中检查您的路由,这也以某种方式作为您站点路由的文档。
我的问题是在可读性和可维护性方面使用属性路由优于基于约定的路由吗?有人可以建议如何设计路线以获得更好的可维护性和可读性。
【问题讨论】:
标签: asp.net-mvc-routing asp.net-mvc-5
为了解决您的第一个问题,分散路线有很多优点:
它将路由信息与实现该路由的控制器操作相邻。这有助于调试和故障排除,并提供在您的解决方案中快速搜索路由信息的能力。
它降低了更改路线过程中的风险。在 RouteConfig.cs 或 WebApiConfig.cs(在 Web API 解决方案的情况下)中,可能会无意中更改错误的路由或以其他方式对应用程序的其他部分产生不利影响。
您可能还希望包含可接受的 HTTP 方法、允许的用户类型和注册优先级,如果包含在基于属性的路由中,则将所有这些信息放在一个位置。
这篇文章在上述方面为我提供了灵感和强化,并且更详细地介绍了:http://kevinmontrose.com/2011/07/25/why-i-love-attribute-based-routing/
【讨论】:
您可以在使用常规路由时对您的路由进行单元测试,并且您还有“关注点分离”。
属性路由不能这么说。
对于大型项目,我会使用传统的,对于小型项目,属性路由就更好了。
【讨论】:
属性路由为您提供更多广告简单的路由选项。
查看以下内容:Routing explanations
【讨论】:
我认为从可维护性和可读性的角度来看,如果您有一个非常适合基于约定的路由的项目,那么就去做吧。在你的配置文件中有一些路由比装饰每个控制器要简单得多。
但是...
根据我的经验,基于约定的路由过于简单,并且经常在大型或更复杂的项目中崩溃。经常发生的情况是您从默认的 {controller}/{action}/{id} 路由开始。但随后您决定需要更多路线,因为您需要更深层次的层次结构,因此开始添加路线。像这样的东西:/company/5/employee/7/edit。然后你必须小心你放置路线的顺序,以便找到正确的路线。一旦您开始添加自定义路由,您可能会发现一个路由与特定请求匹配的更多,因此您添加了一些路由约束。随着您的项目变得更大和/或更复杂,您的路线配置的规模和复杂性也会增加,使其容易出错且难以维护。
属性路由让您可以更好地控制路由,因为您可以将特定控制器和操作映射到特定路由,而不必担心会匹配错误的路由。此外,由于路由与控制器非常接近,因此对路由进行故障排除要容易得多。
TL;DR:在某个点上,无论您是使用基于约定的路由还是属性路由,路由变得更加难以维护。属性路由就是控制您的路由并避免路由错误。
另一个看起来很有前途的替代方案是MvcCodeRouting,它是基于命名空间的路由
【讨论】: