【问题标题】:Web API - Controller DesignWeb API - 控制器设计
【发布时间】:2015-06-08 19:34:33
【问题描述】:

我有一个当前具有 ServicesController 的 Web API 项目。我通过调用获得了服务器的服务列表:

$http.get(rootWebApiUrl + '/api/services/' + server)

ServicesController 有这个签名:

public IEnumerable<FirstSolarService> Get(string id)

现在我想再打两个电话。

  1. 获取服务本身路径中的 Windows 文件夹。
  2. 在用户选择 #1 中的文件夹后,显示该文件夹中的 DLL。

就我的 Web API 控制器而言,我可以做出选择。我应该把这一切都放在 ServicesController 中,还是应该为我返回的每种类型的对象创建单独的控制器?如果是后者,那么我将创建这两个控制器:

  1. 文件夹控制器
  2. 文件控制器

但是(也许)令人尴尬的是,我会通过传入文件夹或文件 ID 以外的其他内容来调用其中的每一个。要获取文件夹,我会传入服务名称。要获取文件,我会传入服务的路径。这是应该的方式吗?我只是想以正确的方式做到这一点。

【问题讨论】:

  • 我认为您不应该将其拆分为多个控制器,除非它们每个都具有相当大的功能(或者文件夹和文件是真正的域对象/存储库实体)。您可能知道,WebAPI 中的方法名称不限于 Get/Post/Put/Delete 约定。如果需要,您可以指定操作名称。例如,如果您想要一个Folders 方法,您可以添加一个(即[HttpGet] public ReturnType Folders(string serviceName)),您的URL 将是'/api/services/folders/' + server
  • 啊,很高兴知道。那么我只需要在我的 RouteConfig 中创建一个路由,它应该可以工作。从哲学上讲,从服务控制器返回文件夹是否正确?
  • 您可能甚至不需要创建路由——默认路由包含{action} 组件。从哲学上讲,我会问:服务是由文件夹组成的吗?文件夹可以在没有服务的情况下存在吗?如果文件夹依赖于服务,那么我认为可以在服务控制器中包含该功能。如果没有,则根据功能拆分控制器。
  • 这些 cmets 是一个很好的答案。如果您想将它们粘贴到答案中,我会接受。
  • 我已经写了一个答案,但要明白,这样的问题有点宽泛,会吸引一些固执己见的答案(我的答案就是这样),而且它最终可能会被关闭。

标签: javascript c# asp.net-web-api


【解决方案1】:

我认为您不应该将其拆分为多个控制器,除非它们每个都具有相当大的功能,或者如果文件夹和文件是真正的域对象/存储库实体。

您可能知道,WebAPI 中的方法名称不限于 Get/Post/Put/Delete 约定。如果需要,您可以指定操作名称。例如,如果你想要一个Folders 方法,你可以添加一个:

[HttpGet] 
public ReturnType Folders(string serviceName)
{
}

您的上述 API URL 将是 '/api/services/folders/' + server

您不需要创建自定义路由——默认路由包含{action} 组件。从哲学上讲,我会问自己:服务是由文件夹组成的吗?文件夹可以在没有服务的情况下存在吗?如果文件夹依赖于服务,那么我认为可以在服务控制器中包含该功能。如果没有,则根据功能拆分控制器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2019-05-26
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多