2012-05-11 14 views
5

Imagine un sistema con Usuarios, Grupos con ApiControllers correspondiente. entonces se puede imaginar siguientes patrones de acceso:Puede ASP.NET Web API manejar sub-recursos con diferentes controladores

/api/users     
/api/users/1 
/api/users?groupId=1 <- #1 returns users belonging to group id 1 via Get(int? groupId) 

/api/groups/ 
/api/groups/1 
/api/groups/1/users  <- #2 sub resource, returns users belonging to group id 1 

¿Es posible delegar la responsabilidad de la # 2 al # 1 de Get(int? groupId) método? Me gustaría mantener la responsabilidad de manejar los recursos secundarios con su Controlador original. En otras palabras, si un sub-recurso también existe como recurso, entonces ¿el manejo de sub-recursos debería ser? delegado al controlador de recursos primario ...

P.S. Ahora, no estoy seguro de si el enfoque anterior es "respetuoso" con los estilos RESTfull, eso es toda otra discusión ...

Respuesta

6

WEB Api Beta no admite el atributo de nivel de método para el enrutamiento. Dijeron, que están pensando en mejorar la historia de enrutamiento para el próximo lanzamiento.

Por ahora, la única forma (como sé) es mapear explícitamente esas rutas. En su caso:

// for your rest style api 
routes.MapHttpRoute(
    name: "UserGroups", 
    routeTemplate: "api/groups/{groupID}/users", 
    defaults: new { controller = "Users"}, 
    constraints: new { groupID = @"\d+" } 
); 

y para el estilo RPC URI de la ruta por defecto va a funcionar como simple vista.

routes.MapHttpRoute(
      name: "ApiDefault", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { controller = "Users", id = RouteParameter.Optional } 
     ); 

Y también se puede anular la clase DefaultHttpControllerFactory crear en sus instancias manera de controladores.

Espero que esta ayuda.

Cuestiones relacionadas