ASP.NET Core Web API 基于聚合拆分控制器

ASP.NET Core Web API split controller based on aggregates

在我的 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
{
     // ....
}

TestApiController

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 的情况下将控制器拆分为多个文件,但要有一个更清晰的概览。

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

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

的路线

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

或者,与其尝试 split/decompose 控制器而非路线,不如重新设计整体 API design/structure 以便您拥有更多控制器和路线。 Interface Segregation Principle 想到这里(是的,它是从面向对象中诞生的,但原则仍然适用)。

在一天结束时,您有呼叫进入 API 由他们的路由定义,然后转到控制器 - 这一切看起来如何(结构化)并不重要只要 API 足够明智、直观且符合目的。

在互联网上进行更多搜索后,我发现了以下有趣的 Nuget 包:

Nuget: Ardalis.ApiEndpoints.

有关此的源代码和示例可在此处找到:

Github: Ardalis.ApiEndpoints.

这使我们能够将控制器分成文件夹,并为每个操作单独 class 以提供我们想要的用途。