C# 组织webapi控制器的最佳方式是什么?

C# 组织webapi控制器的最佳方式是什么?,c#,asp.net-web-api,routes,C#,Asp.net Web Api,Routes,我有一些课程,如客户,书籍,电影,游戏。 我为每个实体创建了4个控制器来执行CRUD并为每个实体指定逻辑。 现在的问题是我想通过customerId 我应该在CustomerController或GamesController中设置方法操作吗? 路线如下所示“/api/customers/123/games” 书、电影也是如此。因此,每个控制器中有3种方法,游戏、电影或客户控制器中的3种方法 那么,最好的管理方法是什么 谢谢要理解的一点是,web api主要基于REST。rest是基于资源的,所

我有一些课程,如
客户
书籍
电影
游戏
。 我为每个实体创建了4个控制器来执行CRUD并为每个实体指定逻辑。 现在的问题是我想通过
customerId
我应该在
CustomerController
GamesController
中设置方法操作吗? 路线如下所示
“/api/customers/123/games”
书、电影也是如此。因此,每个控制器中有3种方法,游戏、电影或客户控制器中的3种方法 那么,最好的管理方法是什么


谢谢

要理解的一点是,web api主要基于REST。rest是基于资源的,所以如果您返回资源游戏,那么您的游戏控制器应该处理它。简单的

让您的客户控制器返回游戏会很有趣。 默认情况下,您的游戏控制器将具有以下功能:

[HttpGet]
[Route("api/games/{customerId}"]
public List<Games> Get(int customerId)
{
    // get games from repository
    return games;
}
[HttpGet]
[路线(“api/games/{customerId}”]
公共列表获取(int customerId)
{
//从存储库获取游戏
返回游戏;
}
例如:

[RoutePrefix("api")]
public class TripsController: ApiController
{
    #region Fields

    private readonly IQueryDispatcher _queryDispatcher;

    #endregion

    #region Constructors

    /// <summary>
    /// Initializes a new instance of the <see cref="TripsController"/> class
    /// </summary>
    /// <param name="queryDispatcher">Query Dispatcher</param>
    public TripsController(IQueryDispatcher queryDispatcher)
    {
        if (queryDispatcher == null)
            throw new ArgumentNullException(nameof(queryDispatcher));
        _queryDispatcher = queryDispatcher;
    }

    #endregion

    #region Actions

    [HttpGet]
    [Route("trips", Name = "TripList")]
    public IHttpActionResult Get([FromUri]TripsQuery query)
    {
        try
        {
            if (query == null)
                return BadRequest();
            var result = _queryDispatcher.Dispatch<TripsQuery, TripsQueryResult>(query);
            HttpContext.Current.Response.Headers.AddPaginationHeader(query, result, new UrlHelper(Request), "TripList");

            return Ok(result);
        }
        catch (Exception)
        {
            return InternalServerError();
        }
    }

    [HttpGet]
    [Route("trips/{tripId}")]
    public IHttpActionResult Get([FromUri]TripDetailsQuery query)
    {
        try
        {
            var result = _queryDispatcher.Dispatch<TripDetailsQuery, TripDetailsQueryResult>(query);
            return Ok(result);
        }
        catch (Exception)
        {
            return InternalServerError();
        }
    }

    #endregion
}

[RoutePrefix("api")]
public class StopsController: ApiController
{
    #region Fields

    private readonly IQueryDispatcher _queryDispatcher;

    #endregion

    #region Constructors

    /// <summary>
    /// Initializes a new instance of the <see cref="StopsController"/> class
    /// </summary>
    /// <param name="queryDispatcher">Query Dispatcher</param>
    public StopsController(IQueryDispatcher queryDispatcher)
    {
        if (queryDispatcher == null)
            throw new ArgumentNullException(nameof(queryDispatcher));
        _queryDispatcher = queryDispatcher;
    }

    #endregion

    [Route("trips/{tripId}/stops", Name = "StopList")]
    [HttpGet]
    public IHttpActionResult Get([FromUri]StopsQuery query)
    {
        try
        {
            if (query == null)
                return BadRequest();
            var result = _queryDispatcher.Dispatch<StopsQuery, StopsQueryResult>(query);
            HttpContext.Current.Response.Headers.AddPaginationHeader(query, result, new UrlHelper(Request), "StopList");
            return Ok(result);
        }
        catch (Exception)
        {
            return InternalServerError();
        }
    }

    [Route("trips/{tripId}/stops/{stopId}")]
    [HttpGet]
    public IHttpActionResult Get([FromUri]StopDetailsQuery query)
    {
        try
        {
            if (query == null)
                return BadRequest();
            var result = _queryDispatcher.Dispatch<StopDetailsQuery, StopDetailsQueryResult>(query);
            return Ok(result);
        }
        catch (Exception)
        {
            return InternalServerError();
        }
    }
}
[RoutePrefix(“api”)]
公共类TripsController:ApicController
{
#区域字段
专用只读IQueryDispatcher\u queryDispatcher;
#端区
#区域构造函数
/// 
///初始化类的新实例
/// 
///查询调度器
公共TripsController(IQueryDispatcher查询Dispatcher)
{
if(queryDispatcher==null)
抛出新ArgumentNullException(nameof(queryDispatcher));
_queryDispatcher=queryDispatcher;
}
#端区
#区域行动
[HttpGet]
[路线(“trips”,Name=“TripList”)]
公共IHttpActionResult获取([FromUri]TripsQuery查询)
{
尝试
{
if(查询==null)
返回请求();
var result=\u queryDispatcher.dispatcher(查询);
HttpContext.Current.Response.Headers.AddPaginationHeader(查询、结果、新UrlHelper(请求),“三元组”);
返回Ok(结果);
}
捕获(例外)
{
返回InternalServerError();
}
}
[HttpGet]
[路线(“trips/{tripId}”)]
公共IHttpActionResult获取([FromUri]TripDetailsQuery)
{
尝试
{
var result=\u queryDispatcher.dispatcher(查询);
返回Ok(结果);
}
捕获(例外)
{
返回InternalServerError();
}
}
#端区
}
[RoutePrefix(“api”)]
公共类停止控制器:ApiController
{
#区域字段
专用只读IQueryDispatcher\u queryDispatcher;
#端区
#区域构造函数
/// 
///初始化类的新实例
/// 
///查询调度器
公共停车场调度员(IQueryDispatcher queryDispatcher)
{
if(queryDispatcher==null)
抛出新ArgumentNullException(nameof(queryDispatcher));
_queryDispatcher=queryDispatcher;
}
#端区
[路线(“trips/{tripId}/stops”,Name=“StopList”)]
[HttpGet]
公共IHttpActionResult获取([FromUri]StopsQuery查询)
{
尝试
{
if(查询==null)
返回请求();
var result=\u queryDispatcher.dispatcher(查询);
HttpContext.Current.Response.Headers.AddPaginationHeader(查询、结果、新UrlHelper(请求),“停止列表”);
返回Ok(结果);
}
捕获(例外)
{
返回InternalServerError();
}
}
[路线(“trips/{tripId}/stops/{stopId}”)]
[HttpGet]
公共IHttpActionResult获取([FromUri]StopDetailsQuery)
{
尝试
{
if(查询==null)
返回请求();
var result=\u queryDispatcher.dispatcher(查询);
返回Ok(结果);
}
捕获(例外)
{
返回InternalServerError();
}
}
}

因此,您可以看到,一次旅行可以有多个站点,但您检索站点的方式仍在站点控制器中,但只是正确映射了路线

Hi Jinish,如果您将其放入GameController,您的路线将是api/games/123=>此路线按id获取单个游戏,而不是按客户获取列表游戏。我认为路线应该是相同的在CustomerController“api/customers/123/games”中。我们可以将其放在CustomerController或GameController中。这是正确的。但唯一的区别是,如果我们谈论REST及其代表的内容,那么游戏应该由GameSontroller返回。当然,您可以使用属性路由,并让该端点在其他任何地方返回游戏。但是,既然您询问了最好的方法(可能是最佳实践),所以我建议使用上面的方法。不,我的意思是把它放在GameController中是正确的,正如你所解释的,但是从[Route(“api/games/{customerId}”)改为[Route(“api/customers/{customerId}/games”)啊..对,对不起,我的错。路线应该是:[Route(“customers/{customerId}/games”)]。但它仍然应该放在游戏控制器中。是的,我同意它应该放在游戏控制器中。关于“api/customers/{customerid}/Games”和“api/Games/customers/{customerid}”之间的路线,您认为如何