استفاده از استاندارد نتیجه در API با .NET 9.0

استفاده از استاندارد نتیجه در API ها ، نگهداری کد را بهبود می بخشد و بازده عملیات را استاندارد می کند. با .NET 9.0 ، ما می توانیم API های خود را برای مقابله با موفقیت ، خطاهای تجاری و خرابی های غیر منتظره ساختار دهیم.
استاندارد نتیجه چیست؟
استاندارد نتیجه نتیجه یک عملیات را محاصره می کند و اجازه می دهد یک شیء برگردانده شود:
موفقیت با یک ارزش
خطای تجارت (مثال: داده های نامعتبر)
شکست غیر منتظره (مثال: استثنائات)
این امر از استفاده بیش از حد از استثنائات جلوگیری می کند و پیش بینی کد را بهبود می بخشد.
اجرای استاندارد نتیجه
بیایید با تعریف یک نتیجه کلاس عمومی شروع کنیم:
public class Result<T>
{
public bool IsSuccess { get; }
public T? Value { get; }
public string? ErrorMessage { get; }
private Result(T value)
{
IsSuccess = true;
Value = value;
}
private Result(string errorMessage)
{
IsSuccess = false;
ErrorMessage = errorMessage;
}
public static Result<T> Success(T value) => new(value);
public static Result<T> Failure(string errorMessage) => new(errorMessage);
}
اکنون می توانیم از این ساختار در خدمات API خود استفاده کنیم.
استفاده از استاندارد در یک سرویس
خدماتی ایجاد کنید که از نتایج استفاده کند:
public class UserService
{
private readonly Dictionary<int, string> _users = new()
{
{ 1, "Henrique" },
{ 2, "Marta" }
};
public Result<string> GetUserById(int id)
{
if (!_users.TryGetValue(id, out var user))
{
return Result<string>.Failure("Usuário não encontrado.");
}
return Result<string>.Success(user);
}
}
ادغام استاندارد نتیجه در یک کنترلر
اکنون ما از این سرویس در یک کنترلر ** ** در Asp.net Core 9.0 استفاده می کنیم:
[ApiController]
[Route("api/users")]
public class UsersController : ControllerBase
{
private readonly UserService _userService = new();
[HttpGet("{id}")]
public IActionResult GetUser(int id)
{
var result = _userService.GetUserById(id);
if (!result.IsSuccess)
{
return NotFound(new { error = result.ErrorMessage });
}
return Ok(new { user = result.Value });
}
}
مثال درخواست و پاسخ
درخواست:
دریافت/API/کاربران/1
پاسخ (200 خوب):
{
"user": "Henrique"
}
اگر نمی توانید پیدا کنید:
دریافت/API/کاربران/99
RESPOSTA (404 یافت نشد):
{
"error": "Usuário não encontrado."
}
بهبود با انواع خطا
ما می توانیم یک کلاس از خطاهای دقیق تر اضافه کنیم:
public class Error
{
public string Code { get; }
public string Message { get; }
public Error(string code, string message)
{
Code = code;
Message = message;
}
}
اکنون ما نتایج را تغییر می دهیم تا یک شیء خطا را در بر بگیرد:
public class Result<T>
{
public bool IsSuccess { get; }
public T? Value { get; }
public Error? Error { get; }
private Result(T value)
{
IsSuccess = true;
Value = value;
}
private Result(Error error)
{
IsSuccess = false;
Error = error;
}
public static Result<T> Success(T value) => new(value);
public static Result<T> Failure(string code, string message) => new(new Error(code, message));
}
اکنون می توانیم از کدهای خطای توصیفی بیشتری استفاده کنیم:
public Result<string> GetUserById(int id)
{
if (!_users.TryGetValue(id, out var user))
{
return Result<string>.Failure("USER_NOT_FOUND", "Usuário não encontrado.");
}
return Result<string>.Success(user);
}
و کنترلر اکنون ساختار یافته تر پاسخ می دهد:
[HttpGet("{id}")]
public IActionResult GetUser(int id)
{
var result = _userService.GetUserById(id);
if (!result.IsSuccess)
{
return NotFound(new { errorCode = result.Error!.Code, message = result.Error.Message });
}
return Ok(new { user = result.Value });
}
پاسخ اکنون:
{
"errorCode": "USER_NOT_FOUND",
"message": "Usuário não encontrado."
}
پایان
استفاده از استاندارد .NET 9.0 پیش بینی کد را بهبود می بخشد و از استفاده بیش از حد از استثنائات جلوگیری می کند. این امکان را برای درمان موفقیت آمیز موفقیت و خرابی فراهم می کند و باعث می شود کد پاک تر و نگهداری ساده تر شود.
اگر قبلاً از این الگوی استفاده کرده اید یا سؤال دارید ، نظر خود را بگذارید!