當我們有多個所需級別的每個方法的路由時,是否有一種方法可以簡化?具有多個路由級別的webapi的乾式方法
我有一個假想的WebAPI項目,我用這個問題的一般看看。它給我們來自某些來源的電影。
public class MovieController : ApiController
{
// GET api/<controller>
public IEnumerable<Movie> Get()
{
return MoviesDB.All();
}
// GET api/<controller>/5
public Movie Get(int id)
{
return MoviesDB.ThisSpecificOne(id);
}
// POST api/<controller>
public void Post([FromBody]Movie value)
{
}
// PUT api/<controller>/5
public void Put(int id, [FromBody]Movie value)
{
}
// DELETE api/<controller>/5
public void Delete(int id)
{
}
}
但讓我們說一些愚蠢的原因電影存儲的流派。所以你需要流派+編號組合。
我假設這是你會怎麼做
config.Routes.MapHttpRoute(
name: "MoviesWithGenre",
routeTemplate: "api/{controller}/{genre}/{id}",
defaults: new { id = RouteParameter.Optional }
);
public class MovieController : ApiController
{
// GET api/<controller>/<genre>
public IEnumerable<Movie> Get(string genre)
{
return MoviesDB.All(genre);
}
// GET api/<controller>/<genre>/5
public Movie Get((string genre, int id)
{
return MoviesDB.ThisSpecificOne(string genre, id);
}
// POST api/<controller>/<genre>
public void Post(string genre, [FromBody]Movie value)
{
}
// PUT api/<controller>/<genre>/5
public void Put(string genre, int id, [FromBody]Movie value)
{
}
// DELETE api/<controller>/<genre>/5
public void Delete(string genre, int id)
{
}
}
所以現在MySite.Com/api/movie/horror/12345
可能會返回一個電影,但我需要添加可選參數的每個方法。現在我發現它們也是按年存儲的。
config.Routes.MapHttpRoute(
name: "MoviesWithGenreAndYear",
routeTemplate: "api/{controller}/{genre}/{year}/{id}",
defaults: new { id = RouteParameter.Optional }
);
public class MovieController : ApiController
{
// GET api/<controller>/<genre>/<year>
public IEnumerable<Movie> Get(string genre, int year)
{
return MoviesDB.All(string genre, int year);
}
// GET api/<controller>/<genre>/<year>/5
public Movie Get(string genre, int year, int id)
{
return MoviesDB.ThisSpecificOne(string genre, int year, id);
}
// POST api/<controller>/<genre>/<year>
public void Post(string genre, int year, [FromBody]Movie value)
{
}
// PUT api/<controller>/<genre>/<year>/5
public void Put(string genre, int year, int id, [FromBody]Movie value)
{
}
// DELETE api/<controller>/<genre>/<year>/5
public void Delete(string genre, int year, int id)
{
}
}
這一切都可以正常工作,但是每個新層都需要爲每個方法添加一個新參數。這不覺得很DRY
我可以注入這些層到構造函數而不是方法本身。
也許我想根據這些圖層對控制器進行不同的初始化,所以我會根據流派和/或年份或類似情況設置不同的回購。
有沒有解決方案呢?
我dont't有足夠的信譽來增加超過2個鏈接..你可以在http://www.asp.net/web-api/overview/odata-support-in-aspnet找到OData的支持信息-web-api –
這非常整齊。我upvoted你,但我也有興趣在實際路由URL的參數是不可選的,似乎OData解決方案,當你想限制你的搜索更好的答案。請注意,我沒有製作電影服務,我只是以此爲例。我問,如果你必須給每個呼叫限制在一個特定子集/數據庫等 –
也許有點沉重的解決方案,但你可以實現IHttpControllerSelector和IHttpActionSelector什麼:這兩個給你至極的動作控制哪些控制器獲取給定HttpRequestMessage –