特性路由

路由的目的:对http请求提取ControllerName和ActionName,从而映射到具体Action。
特性路由:在设计时通过对Controller或Action标注映射到路由上,其实时根据Controller或Action上Attribute生成Route并添加到RouteTable

特性路由注册

特性名 注册方式 例子
RouteAttribute 定义Action对应的路由 [Route("movies/{id}")]
RoutePrefixAttribute 应用于Controller,定义前缀 RoutePrefix("movies/")
RouteAreaAttribute 应用于Controller,定义于Area RouteArea("movies")

注意定义模板的占位符指代Action的参数,ControllerAction以通过反射赋值,最终生成的Route加入到RouteTable

路由约束

路由的占位符约束,内联约束的写作形式。
[Route("movies/{id:int}")]id必须为int类型。
内部象关流程

  1. RouteCollectionAttributeRoutingExtensions的扩展方法完成特性路由注册
    public static void MapMvcAttributeRoutes(this RouteCollection routes,IInlineConstraintResolver constraintResolver)
  2. 根据字符选择约束类型IInlineConstraintResolver,实现接口类DefaultInlineConstraintResolver属性ConstraintMap为约束字典,ResoveConstraint(string inlineConstraint) 方法返回约束实体
  3. 约束继承接口 IRouteConstraint

自定约束

自定义特性路由

  1. 约束实现接口IRouteConstraint
  2. 注册如内联约束
public static class RouteConfig 
{
    public static void RegisterRoutes( RouteCollection routes) 
    { 
        DefaultInlineConstraintResolver constraintResolver = new DefaultInlineConstraintResolver(); 
        constraintResolver. ConstraintMap. Add( "culture", typeof( CultureRouteConstraint)); 
        routes. MapMvcAttributeRoutes( constraintResolver); 
        //其他 操作 
    } 
}

路由创建过程

怎样根据特性生成路由的呢?

  1. 在运行routes.MapMvcAttributeRoutes( constraintResolver);时,会通过DependencyResolver提取ControllerFactory
  2. 通过ControllerFactory得到所有的Controller
  3. 根据Controller得到ReflectedAsyncControllerDescriptor,在得到在ControllerAction上的Attribute
  4. 最后将得到的Route添加到RouteTable

猜你喜欢

转载自www.cnblogs.com/LoveTomato/p/9609759.html