2

我有多个要通过以下 URI 公开的资源

  1. http:///国家 GET
  2. http:///states?countryCode=** 获取
  3. http:///persons 获取、发布、放置、删除

我正在使用 Asp.Net Web API 来构建 RESTful 服务来访问这些资源。

为这些创建控制器时的最佳实践是什么?我应该为每个资源创建单独的控制器吗?或者有什么方法可以将这些 url 映射到单个控制器的操作?

单个控制器类将有所帮助如果我使用 DependencyResolver,因为我看到 DependencyResolver 可以返回单个控制器的实例。(我这里可能错了)

我需要依赖解析器,因为我的控制器类将通过构造函数注入拥有一些存储库对象。

我不会使用任何 IoC,只有穷人的 DI。

一个加法

我已经在用于 REST 的 WCF Web Api 中成功设计了这个问题,但在 Asp.Net Web API 中没有。我是新来的。

4

3 回答 3

3

为每个资源创建一个单独的控制器。

破坏 API 是个坏主意,因为您遇到了 DI 问题。

免费的Apigee Web API Design 电子书非常简短,非常好,当然值得一读。

于 2013-06-18T13:05:10.220 回答
0

在 Web API 中,多个不同的 url 可以映射到单个控制器的操作。这是如何完成的:

在 App_Start 文件夹下的 WebApiConfig.cs 中,默认映射会自动创建为:

    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

要映射动作方法,请在上述路由中添加一个{action}参数routeTemplate,如下所示:

            routeTemplate: "api/{controller}/{action}/{id}",

现在您可以创建一个具有不同操作方法的控制器来匹配您的请求。控制器操作如下所示:

    // Reached by /api/controllername/getcountries
    public IEnumerable<string> GetCountries()
    {
        // Custom code
    }


    // Reached by /api/controllername/getstates/countrycode
    public IEnumerable<string> GetStates(string id)
    {
        // id contains the countrycode string
    }

确保操作方法名称仍以​​ HTTP 动词开头:Get | Put | Post | Delete

于 2013-10-10T15:16:45.753 回答
0

正如 Neil 上面提到的,最佳实践是创建 3 个不同的控制器:

  • 国家控制器
  • 状态控制器
  • 人员控制器

如果您从 ApiController 派生它们,它们将在以下 url 下自动可用:

  • /api/国家
  • /api/状态
  • /api/人

如果您从 Controller 派生,它们将在以下 url 下可用:

  • /国家
  • /状态
  • /人

至于依赖注入,您可以从自己的 BaseController 派生并在那里注入所有依赖项,如果这是您绝对需要的。或者每个类可能需要不同的接口并让您的 DI 解决该问题。

希望能帮助到你!

于 2013-08-27T17:08:16.833 回答