2014-08-29 92 views
0

我有一个案例,我试图创建一大堆Api控制器。我创建了一个基类控制器,它具有所有基本的GET,PUT,POST,DELETE操作以及其他一些对于该项目来说很常见的操作。如何让MapHttpAttributeRoutes注册父类路由

然后,我使用T4来编写我的数据库中的每个表(EF上下文,但不能少)作为控制器,明显从该父控制器继承(谁最终从ApiController继承。路由问题。

在基类显然,你无法定义归因路线,并有MapHttpAttributeRoutes找到它们。

下面给出这个suedo代码有任何建议违背了这种信念,是有“好”的方式处理这个问题?现在想到的是将基类和脚本中的每个控制器都放在T4中。

public class TestBaseController: ApiController { 

    // GET api/user 
    [Route("")] 
    [HttpGet] 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 
} 


[RoutePrefix("apiv2/user")] 
public class UserController: TestBaseController 
{ 
    [Route("type")] 
    [HttpGet] 
    public string GetType() 
    { 
     return "my test type"; 
    } ... 

apiv2/user/results in a 404,but apiv2/user/type returns returns the expected string。

回答

2

默认属性的路由不被继承,但是通过Web API 2.2,我们增加了这样做的能力:

例子:

public class BaseController : ApiController 
{ 
    [Route("{id:int}")] 
    public string Get(int id) 
    { 
     return "Success:" + id; 
    } 
} 
[RoutePrefix("api/values")] 
public class ValuesController : BaseController 
{ 
} 

//--------------------------------------------------- 

config.MapHttpAttributeRoutes(new CustomDirectRouteProvider()); 

public class CustomDirectRouteProvider : DefaultDirectRouteProvider 
{ 
    protected override IReadOnlyList<IDirectRouteFactory> 
    GetActionRouteFactories(HttpActionDescriptor actionDescriptor) 
    { 
     return actionDescriptor.GetCustomAttributes<IDirectRouteFactory> 
     (inherit: true); 
    } 
} 
+0

不错,THX这真的帮了我 – Demodave 2016-09-28 13:05:17