簡體   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