تبدیل Resultها به پاسخهای API 🚀
آبجکت Result در نهایت به endpoint Minimal API (یا کنترلر) در ASP.NET Core خواهد رسید. Minimal APIها یک پاسخ IResult برمیگردانند و کنترلرها یک پاسخ IActionResult برمیگردانند. صرف نظر از این، شما باید نمونه Result را به یک پاسخ API معتبر تبدیل کنید.
رویکرد سرراست، بررسی وضعیت Result و برگرداندن یک پاسخ HTTP است. در اینجا یک مثال آمده است که در آن ما فلگ Result.IsFailure را بررسی میکنیم:
app.MapPost(
"users/{userId}/follow/{followedId}",
async (Guid userId, Guid followedId, FollowerService followerService) =>
{
var result = await followerService.StartFollowingAsync(
userId,
followedId,
DateTime.UtcNow);
if (result.IsFailure)
{
return Results.BadRequest(result.Error);
}
return Results.NoContent();
});
با این حال، این یک فرصت عالی برای یک رویکرد تابعیتر است. شما میتوانید متد توسعه Match را برای ارائه یک callback برای هر وضعیت Result پیادهسازی کنید. متد Match، callback مربوطه را اجرا کرده و نتیجه را برمیگرداند.
در اینجا پیادهسازی Match آمده است: 👍
public static class ResultExtensions
{
public static T Match<T>(
this Result result,
Func<T> onSuccess,
Func<Error, T> onFailure)
{
return result.IsSuccess ? onSuccess() : onFailure(result.Error);
}
}
و اینگونه از متد Match در یک endpoint Minimal API استفاده میکنید:
app.MapPost(
"users/{userId}/follow/{followedId}",
async (Guid userId, Guid followedId, FollowerService followerService) =>
{
var result = await followerService.StartFollowingAsync(
userId,
followedId,
DateTime.UtcNow);
return result.Match(
onSuccess: () => Results.NoContent(),
onFailure: error => Results.BadRequest(error));
});
خلاصه 📝
اگر قرار است یک چیز را از مقاله امروز با خود ببرید، باید این باشد: استثناها برای شرایط استثنایی هستند. علاوه بر این، شما فقط باید از استثناها برای خطاهایی که نمیدانید چگونه مدیریت کنید، استفاده کنید. در تمام موارد دیگر، بیان واضح خطا با الگوی Result ارزشمندتر است.
استفاده از کلاس Result به شما اجازه میدهد تا:
✅ نیت اینکه یک متد ممکن است شکست بخورد را بیان کنید.
✅ یک خطای اپلیکیشن را در داخل آن کپسوله کنید.
✅ یک راه تابعی برای مدیریت خطاها فراهم کنید.
علاوه بر این، شما میتوانید تمام خطاهای اپلیکیشن را با کلاس Error مستندسازی کنید. این برای توسعهدهندگان مفید است تا بدانند کدام خطاها را باید مدیریت کنند.
شما حتی میتوانید این را به مستندات واقعی تبدیل کنید. 📚 برای مثال، من یک برنامه ساده نوشتم که پروژه را برای تمام فیلدهای Error اسکن میکند. سپس این را به فرمت جدول تبدیل کرده و در یک صفحه Confluence آپلود میکند.
بنابراین من شما را تشویق میکنم که الگوی Result را امتحان کنید و ببینید چگونه میتواند کد شما را بهبود ببخشد.





