2014-08-29 56 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