API 控制器设计 - 多少业务逻辑是太多的逻辑?在插入新记录之前检查数据库中的用户

API Controller Design - How much business logic is too much logic? Checking for user in database before inserting a new record

我正在使用 ASP.NET 核心和 Entity Framework 核心编写 REST API。到目前为止,我的控制器只有最少的逻辑,通常推迟到处理通常的数据库操作的服务层。

我的 API 将被 Discord 机器人使用,我希望能够在用户发出命令时自动在我的数据库中注册用户,该命令实际上最终会将新记录插入其中一个数据库表:

[HttpPost]
public async Task<ActionResult<recordDto>> CreateRecord(CreateRecordDto recordDto)
{
    var record = new Record
    {
        Name = recordDto.Name,
        Alias = recordDto.Alias,
        UserId = recordDto.UserId,
        ServerId = recordDto.ServerId,
    };
    
    try
    {
        await _service.CreateRecord(record);
    }
    catch (status.ConflictException)
    {
        return Conflict();
    }
    catch (DbUpdateException)
    {
        throw new Exception("Error adding record.");
    }

    return CreatedAtAction("Test", new { id = record.Id }, record);
}

但在此之前,我需要检查用户是否存在于数据库中。这很简单,因为我有另一项服务可以用来检查该情况。但是,我对将此逻辑放入控制器犹豫不决,因为它会增加我的控制器所需的依赖性,并引入更多我理解控制器不应该处理的业务逻辑。我是否过度思考我的设计?这个逻辑到底应该在哪里处理?

虽然我不知道 business 这个 API 的目的是什么,但你所展示和描述的似乎更像是 CRUD API。我在这里看不到任何 业务逻辑 ,除非您正在自动化一个流程,其中 业务规则 类似于 "A user cannot be added twice".

但这并不能解决你的问题。您担心太多的依赖关系以及应该处理此逻辑的正确位置。

了解为什么有某些规则很重要。开发人员担心,如果依赖项太多,一个 class 就有 too many responsibilities ,因此变得不灵活,难以测试和更改。这是一个合理的担忧,但请始终问问自己它是否适用于您的情况;您的 API 会做除此以外的任何事情吗?因此,它需要灵活吗?添加一个额外的层不是免费的,所以一个简单的设计可以保持简单(即使打破“规则”)。

在你的情况下,我确实认为你在考虑依赖性的情况下过度考虑了你的设计。如果我能给你一个提示:在其他地方处理错误处理(在过滤器属性或其他东西中),这样你就不必在每个端点复制它。但是,前提是您打算拥有多个!