繁体   English   中英

API controller 中的业务逻辑

[英]Business logic in the API controller

我的 ClientsController 中有这个方法:

//POST api/v1/clients
[HttpPost]
public async Task<ActionResult> CreateClient([FromBody] CreateClientDto createClientDto)
{
    await _createClientService.Create(createClientDto.MapToClient());
    return CreatedAtRoute("GetClient", new { clientId = createClientDto.ClientId });
}

如您所见,此方法引用了先前注入的服务。 该服务如下所示:

public class CreateClientServiceImpl : ICreateClientService
{
    private readonly ConfigurationDbContext configurationDbContext;

    public CreateClientServiceImpl(ConfigurationDbContext configurationDbContext)
    {
        this.configurationDbContext = configurationDbContext;
    }

    public async Task Create(Client client)
    {
        await configurationDbContext.Clients.AddAsync(client.ToEntity());
        await configurationDbContext.SaveChangesAsync();
    }
}

这就是问题出现的地方。 我将在哪里检查 clientId 是否存在? 我认为不在 ICreateClientService 中,因为它会违反单一责任原则规则。 我可以创建下一个服务来检查用户是否存在并在 controller 方法中使用它,但我认为 controller 方法中的逻辑太多了。 那我该怎么办? 可以肯定的是,ClientId 不是增量 Id,但也是唯一的。

首先回答这个问题:如果客户端已经存在,您的应用程序将如何反应?

另外,您是否知道SaveChangesAsync()可以抛出DbUpdateExceptionDbUpdateConcurrencyException的事实? 目前,您没有处理这些情况。

一种可能性是引入异常,例如DuplicateClientException并在您的CreateClientServiceImpl.Create方法中抛出此异常(如果此客户端已存在)。 另一种选择是Create返回一个布尔值,指示 create 语句是否成功。 如果失败,它可能会返回 false(一个原因可能是客户端已经存在)。 您还可以返回一个Result对象。 Ardelis 有一个库,请参阅Result ,它为您遇到的问题提供了解决方案。

然后,您的 controller 方法可以处理异常,转换您认为合适的方法返回值或(自动)将Result object 转换为正确的状态代码,例如400 Bad Request

现在,如果您的主键设置正确,我相信您的代码会遇到异常,并且您的 controller 将返回500 Internal Server Error 如果这是您想要的行为,那么您无需更改任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM