1

这是跨 asp.net web api 项目管理许多方法的简单问题。

我们有很多这样的方法:

ProductsApiController.GetByType(string type, string x)
ProductsApiController.GetByType(string type, int limit)
//method has a number of arguments.. 
ReportsApiController.GetAll(string x, string y)

问题:我们有很多带有自定义参数的方法,我们必须为每个方法定义一个自定义路由

routes.MapRoute(
    name: "ProductRoute",
    url: "ProductsApiController/{type}/{x}"
);

routes.MapRoute(
    name: "ReportRoute",
    url: "ReportsApiController/{x}/{y}"
);

我正在简化签名,有很多方法有很多参数,而这些方法通常没有共同的参数。

这个的一般模式是什么?有没有更好的方法来做到这一点,还是我只剩下这个了。

4

2 回答 2

1

在这种情况下,在查询字符串中传递 URI 参数变得非常方便。您可以只定义一个路由,然后通过查询传入该操作的所有 URI 参数(例如 ReportsApi/GetAll?x=5&y=6)。您只需使用包含操作 ({controller}/{action}) 的路径模板定义路由。

否则,如果您希望以不同方式在路径内传递所有参数,我想不出更好的方法。因为你必须让路由系统知道从哪里获取每个参数以及它应该绑定到什么参数名称。没有像查询字符串参数那样决定参数名称的约定。您可以在下面查看 Filip 关于使用属性路由的好建议。它不会减少您必须编写的路由数量,但至少它们会更接近您需要它们的代码。

于 2013-01-11T13:36:41.707 回答
1

我会说对于您的场景,最合乎逻辑的解决方案是使用属性路由。

是的,这仍然意味着您必须创建很多路由,但是由于它们有效地绑定到单个操作,因此将路由放在装饰该操作的属性中是最有意义的。

You can get AR from Nuget:

PM> Install-Package AttributeRouting.WebApi

In your case it would look like this:

[GET("mytype/{type}/{x}")]
public MyType GetByType(string type, string x)

[GET("mytype/{type}/{limit}")]
public MyType GetByType(string type, int limit)

and so on... which, IMHO is much more manageable

A while ago I wrote an intro post to AR - http://www.strathweb.com/2012/05/attribute-based-routing-in-asp-net-web-api/

You can also visit their excellent wiki - https://github.com/mccalltd/AttributeRouting/wiki

于 2013-01-11T15:44:18.910 回答