我有一些类,例如 Customer
, Book
, Movie
, Game
。我每个实体创建了4个控制器,以执行CRUD并指定每个控制器。现在问题是我想通过customerId
检索清单游戏我应该将方法操作放在CustomerController
还是GamesController
中?路线将就像此"/api/customers/123/games"
电影,电影也是如此。因此,每本控制器,游戏,电影或客户控制器中的3种方法中的3种方法那么管理此问题的最佳方法是什么?
谢谢
请参阅要理解的要点是,Web API在很大程度上基于REST。休息是基于资源的,因此,如果您要返回资源游戏,那么您的GamesController应该处理它。简单
拥有您的客户控制器返回游戏会很有趣。默认情况下,您的游戏控制器将具有以下内容:
[HttpGet]
[Route("api/games/{customerId}"]
public List<Games> Get(int customerId)
{
// get games from repository
return games;
}
举一个例子:
[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();
}
}
}
因此,您看到的是,旅行可以有多个停靠点,但是您的停止停止的方式仍在停止控制器中,但只需正确地映射路线