بهکارگیری الگوی Result 🚀
حالا که کلاس Result را داریم، بیایید ببینیم چگونه آن را در عمل به کار ببریم.
در اینجا یک نسخه بازآرایی (refactor) شده از FollowerService آمده است. به چند نکته توجه کنید:
✅ دیگر هیچ استثنایی پرتاب نمیشود.
✅ نوع بازگشتی Result صریح است.
✅ مشخص است که متد کدام خطاها را برمیگرداند.
مزیت دیگر مدیریت خطا با استفاده از الگوی Result این است که تست کردن آن آسانتر است.
public sealed class FollowerService
{
private readonly IFollowerRepository _followerRepository;
public FollowerService(IFollowerRepository followerRepository)
{
_followerRepository = followerRepository;
}
public async Task<Result> StartFollowingAsync(
User user,
User followed,
DateTime utcNow,
CancellationToken cancellationToken = default)
{
if (user.Id == followed.Id)
{
return Result.Failure(FollowerErrors.SameUser);
}
if (!followed.HasPublicProfile)
{
return Result.Failure(FollowerErrors.NonPublicProfile);
}
if (await _followerRepository.IsAlreadyFollowingAsync(
user.Id,
followed.Id,
cancellationToken))
{
return Result.Failure(FollowerErrors.AlreadyFollowing);
}
var follower = Follower.Create(user.Id, followed.Id, utcNow);
_followerRepository.Insert(follower);
return Result.Success();
}
}
مستندسازی خطاهای اپلیکیشن 📚
شما میتوانید از کلاس Error برای مستندسازی تمام خطاهای ممکن در اپلیکیشن خود استفاده کنید.
یک رویکرد، ایجاد یک کلاس استاتیک به نام Errors است. این کلاس، کلاسهای تودرتو در داخل خود خواهد داشت که حاوی خطاهای خاص هستند. نحوه استفاده به شکل Errors.Followers.NonPublicProfile خواهد بود.
با این حال، رویکردی که من دوست دارم استفاده کنم، ایجاد یک کلاس خاص است که حاوی خطاها باشد.
در اینجا کلاس FollowerErrors آمده است که خطاهای ممکن برای انتیتی Follower را مستند میکند: 📝
public static class FollowerErrors
{
public static readonly Error SameUser = new Error(
"Followers.SameUser", "Can't follow yourself");
public static readonly Error NonPublicProfile = new Error(
"Followers.NonPublicProfile", "Can't follow non-public profiles");
public static readonly Error AlreadyFollowing = new Error(
"Followers.AlreadyFollowing", "Already following");
}
به جای فیلدهای استاتیک، شما همچنین میتوانید از متدهای استاتیک که یک خطا برمیگردانند، استفاده کنید. شما این متد را با یک آرگومان مشخص فراخوانی میکنید تا یک نمونه Error دریافت کنید.
public static class FollowerErrors
{
public static Error NotFound(Guid id) => new Error(
"Followers.NotFound", $"The follower with Id '{id}' was not found");
}