【问题标题】:Strongly typed web api route endpoints in mvcmvc 中的强类型 Web api 路由端点
【发布时间】: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


【解决方案1】:

API 路由不应指定操作。您希望您的路线成为一条记录或一组记录的逻辑路径。例如,在您的情况下,路线应如下所示:

GET
api/giftcards/{userID:int:min(1)}

您希望能够从根本上走上 url 并获得您所期望的。在示例路线的情况下,您将根据用户 ID 获得礼品卡。如果您要关闭用户 ID 页面并仅调用 api/giftcards,您会期望所有用户都获得所有礼品卡。我在这里使用的是 ID,但您也可以使用电子邮件。

【讨论】:

  • 感谢您的建议。我会将其视为更好的命名标准,因为这是一个好主意。但是,这仍然不能解决我如何在我的 MVC 项目中“强烈”引用该路由的问题,因此我不必手动将 url 作为字符串传递。有什么想法吗?
  • 看起来您已经有了最好的方法。在嵌套类中使用常量路径。所以基本上你有一个 AppConstants 类,里面有一个名为 APIRoutes 的静态类,然后是你的 api 路径的静态常量字符串。然后调用它,你会像在你的问题中一样使用它:(AppConstants.APIRoutes.Giftcards, email)
【解决方案2】:

请尝试在这样的操作中使用“ActionName”属性:

 [ActionName("SelectAll")]
        public IEnumerable<Customer> Get()
        {
       ...
        }

像这样调用这个动作名称:

$("#getdata").click(function () {
  var options = {};
  options.url = "/api/customer/SelectAll";
  options.type = "GET";
  ...
  ...
  $.ajax(options);
});

注意:'getdata' 是控制将触发哪个点击事件并从 api 调用 'api 方法' 和 getdata 的 id

【讨论】:

    【解决方案3】:

    Here's a library 这可能就是您要找的。​​p>

    虽然我喜欢静态字符串,但当客户端需要更新时,您不必总是向团队中的未来开发人员展示如何使用所述库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      相关资源
      最近更新 更多