簡體   English   中英

組織webapi控制器的最佳方法是什么?

[英]What is the best way to organize webapi controller?

我有一些類,例如CustomerBookMovieGame 我為每個實體創建了4個控制器來執行CRUD並為每個實體指定邏輯。 現在的問題是,我想按customerId檢索列表游戲。應該將方法action放在CustomerControllerGamesController嗎? 路線將類似於"/api/customers/123/games"並且與Book,Movie相同。 因此,每個控制器中的3種方法Book,Game,Movie或Customer控制器中的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();
        }
    }
}

因此,您可以看到,一次旅行可以有多個停靠點,但是您回退停靠點的方式仍在停靠點控制器中,只是路線已正確映射

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM