【问题标题】:Is it OK for multiple REST API methods to share same controller class?多个 REST API 方法可以共享同一个控制器类吗?
【发布时间】:2019-01-04 12:47:36
【问题描述】:

最好的做法是将每个不同的Get 方法放在它自己的控制器类中,还是在同一个类中有多个(相关和不相关)API 方法非常好,如果方法非常简单并且不复杂。

例如这两个 API 方法在同一个控制器类中工作正常,但在自己的类中会更好吗?

如果是,为什么?

public class TestController : ApiController
{
    [HttpGet]
    [Route("api/test/ping")]
    public IHttpActionResult Ping()
    {
        try
        {
            return Ok("HELLO");
        }
        catch (Exception ex)
        {
            return Content(HttpStatusCode.InternalServerError, ex.Message);
        }
    }

    [HttpGet]
    [Route("api/test/echo/{message}")]
    public IHttpActionResult Echo(string message)
    {
        try
        {
            return Ok(message);
        }
        catch (Exception ex)
        {
            return Content(HttpStatusCode.InternalServerError, ex.Message);
        }
    }
}

【问题讨论】:

  • 在一个控制器中拥有多个 getter 是完全合法的,尤其是当它们的路由应该相似时。
  • 除了下面的答案,我是否可以建议研究面向服务的架构。我认为它会让你思考很多问题,比如“这种方法应该去哪里,因为我有一些服务/控制器,但它们都不适合这种方法。”

标签: c# asp.net-web-api asp.net-web-api2 asp.net-web-api-routing


【解决方案1】:

一旦它们的路由不同并且不会在当前或其他控制器中引起路由冲突,没有什么可以阻止您在控制器中执行多个操作。

以您提供的示例为例。您可以利用控制器的路由前缀来帮助组织类似的路由

[RoutePrefix("api/test")]    
public class TestController : ApiController {

    //GET api/test/ping
    [HttpGet] [Route("ping")]
    public IHttpActionResult Ping() {
        return Ok("HELLO");
    }

    //GET api/test/echo/hello%20world
    [HttpGet] [Route("echo/{message}")]
    public IHttpActionResult Echo(string message) {
        if(message == null)
            return BadRequest();
        return Ok(message);
    }
}

【讨论】:

    【解决方案2】:

    就我个人而言,我会将相关的 API 操作放在一起做相关工作的 1 个单个控制器类中。

    在您给定的示例中,将它们放在一起就可以了。另一个例子,假设你有一个控制器来处理用户模型上的所有操作(请注意不是完全有效的代码,但希望你明白这一点):

    [RoutePrefix("api/users")]
    public class UserController: ApiController
    {
        [HttpGet]
        public IHttpActionResult GetUsers()
        {
            // GET all users.
        }
    
        [HttpGet]
        [Route("{id}")]
        public IHttpActionResult GetUserById(int id)
        {
            // GET user by ID
        }
    
        [HttpPost]
        public IHttpActionResult CreateUser()
        {
            // Create User
        }
    
        [HttpPut]
        [Route("{id}")]
        public IHttpActionResult UpdateUser()
        {
            // Update User
        }
    }
    

    如您所见,所有这些操作都适用于 User 模型,因此它们组合在一个 Controller 类中。

    【讨论】:

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