【发布时间】:2015-08-14 16:26:33
【问题描述】:
所以我有两个独立的项目(一个 Web Api 2 和一个 MVC),如下图:
MVC 具有控制器和服务层。从 MVC 应用程序调用 Web api 控制器的服务。例如:
await _service.GetGiftCards("/api/GiftCards/ViewAllByUser", email);
Web Api 控制器的路由定义如下:
[RoutePrefix("api/giftcards")]
[Route("ViewAllByUser")]
public async Task<List<GiftCard>> GetGiftCardsForUser(string email){}
所以要在 MVC 应用程序中定义端点路由,我只需传递一个类似于上面“/api/GiftCards/ViewAllByUser”的字符串。
我的问题是,有没有更好的方法来“强输入”定义的 Web Api 路由的端点,以便我可以做类似的事情?:
await _service.GetGiftCards(GiftCardController.ViewAllByUser, email);
我想至少我可以总是像这样将端点字符串存储在一个静态类中,所以它们至少可以在一个地方更新:
public static class ApiEndpoints(){
public string GetAllGiftCards = "api/GiftCards/ViewAllByUser";
}
但我想知道是否有更好的方法或其他建议。谢谢!
【问题讨论】:
-
您是否有理由明确指定路线而不是依赖约定?
-
Web API 控制器将用于多个外部应用程序(Web、移动设备等),并将封装数据访问和业务逻辑,因此我将它们命名为更像描述性方法名称,但我可以在大多数情况下,请参阅依赖约定的用途。但是不管我的路由名称是什么,我仍然希望能够强引用它以便使用它。
-
如果你想要一个统一资源定位器的强类型表示,那么,there's a type for that。也许为这些家伙保留一张行动图?不过,你最终会在某个时候用字符串构建它们,因为这就是 URL。
-
@DanJ 是的,我明白你的观点,它很可能在某个时候需要成为一个字符串;但如果有某种方法可以在 Web API 项目和 MVC 项目之间进行映射,那就太好了。这样,如果有人在 Web API 项目中更新路由名称,只要 MVC 项目使用此“映射”,字符串端点也不必在那里手动更新。
-
这是一个合理的愿望。您提出的建议听起来很像 WCF,具有强类型合同。这是您为 Web API 的互操作性所做的权衡(我可以看到您有多个不同类型的客户端)。如果 MVC 应用程序和服务之间的自动奇偶校验非常重要,那么混合方法可能会奏效。
标签: c# asp.net-mvc asp.net-web-api asp.net-web-api-routing