多个REST API方法共享同一控制器类是否可以?

时间:2018-07-27 11:40:26

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

是将每个不同的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);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

[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);
    }
}

答案 1 :(得分:2)

个人而言,我会将可以一起执行相关工作的相关API动作放在一个单一的控制器类中。

在您给出的示例中,将它们放在一起会很好。再举一个例子,假设您有一个处理用户模型上所有动作的控制器(请注意,代码并非完全有效,但希望您能理解这一点):

[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类中合为一体。