首页 > 解决方案 > 基于聚合的 ASP.NET Core Web API 拆分控制器

问题描述

在我的 API 项目中,我目前有 1 个控制器,其语法如下:

抽象基础控制器

[Produces("application/json")]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status406NotAcceptable)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public abstract class BaseApiController : ControllerBase
{
     // ....
}

测试API控制器

public class TestApiController : BaseApiController 
{
    // Parent action methods
    [HttpGet]
    
    [HttpPost]

    ...

    // Child action methods
    [HttpGet("{test:guid}/child")]
    
    [HttpGet("{test:guid}/child/{id:guid}")]

    ...
}

这为我们提供了以下网址:

http://localhost/api/v1.0/test
http://localhost/api/v1.0/test/1
http://localhost/api/v1.0/test/1/child
http://localhost/api/v1.0/test/1/child/1

问题

如何在不限制 URL 的情况下将控制器拆分为多个文件,但要获得更清晰的概览。

因此,一个控制器用于所有测试操作,另一个控制器用于所有子操作。

标签: asp.net-corearchitecture

解决方案


我不是从这里丰富的控制器经验中谈论的(我已经做过一些),但我想你会发现控制器就是控制器 - 因为没有简单的方法来拥有一个控制器路由不是1:1。

但是,如果你想让控制器更易于管理,你可以让它们尽可能精简,并将大量代码放入控制器调用的类中。

或者,与其尝试拆分/分解控制器而不是路由,不如重新设计整体 API 设计/结构,以便拥有更多控制器和路由。这里想到了接口隔离原则(是的,它源于 OO,但该原则仍然适用)。

归根结底,您会调用由路由定义的 API,然后调用控制器 - 只要 API 足够明智、直观和适合目的。


推荐阅读