C# 多个RESTAPI方法共享同一个控制器类可以吗?

C# 多个RESTAPI方法共享同一个控制器类可以吗?,c#,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,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() {

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

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

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

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

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

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

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

就我个人而言,我会把相关的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
    }
}

正如您所看到的,所有这些操作都在用户模型上工作,因此它们可以组合在一个控制器类中。

我个人会将相关的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
    }
}

正如您所看到的,所有这些操作都在用户模型上工作,因此它们可以组合在一个控制器类中。

在一个控制器中有多个getter是完全合法的,特别是如果它们的路径应该相似的话。除了下面的答案之外,我建议您研究面向服务的体系结构。我想这会给你很多思考的问题,比如这个方法应该去哪里,因为我有一些服务/控制器,没有一个是适合这个方法的。在一个控制器中有多个getter是完全合法的,特别是如果它们的路径应该相似的话。除了下面的答案,我可以建议研究面向服务的体系结构吗。我想这会给你很多思考的问题,比如这个方法应该去哪里,因为我有一些服务/控制器,没有一个是适合这个方法的。