【发布时间】:2020-10-21 12:29:38
【问题描述】:
我想将我的错误分开,因为它们的定义非常详细,这是一个错误模型:
public interface IErrorResult : IResult
{
string Code { get; set; }
string Message { get; set; }
string Description { get; set; }
}
一个例子:
public static class CheckoutError
{
public static ErrorResult Purchased = new ErrorResult
{
Code = CheckoutErrors.AlreadyPurchased,
Message = "License already bought.",
Description = "A license for this account already exists."
};
public static ErrorResult Expired = new ErrorResult
{
Code = CheckoutErrors.Expired,
Message = "Checkout Expired.",
Description = "The checkout session expired, please try again."
};
public static ErrorResult NotFound = new ErrorResult
{
Code = CheckoutErrors.NotFound,
Message = "Checkout not found.",
Description = "This checkout session doesn't exist."
};
}
我将这些单独定义的原因是它们可以重复使用,并且在必要时更容易修改它们。
在调用业务逻辑之前调用的验证器中使用这些错误,如下所示:
public class CheckoutValidator : ICheckoutValidator
{
private readonly ICheckoutSessionRepository _checkoutSessionRepository;
private readonly ILicenseValidator _licenseValidator;
public CheckoutValidator(ICheckoutSessionRepository checkoutSessionRepository)
{
_checkoutSessionRepository = checkoutSessionRepository;
}
public async Task<IResult> ValidateSession(string userId)
{
var checkout = await _checkoutSessionRepository.GetBySession(userId);
if (checkout == default(CheckoutSession) || checkout.User.AspNetUserId != userId)
{
var error = CheckoutError.NotFound;
error.Status = ResultStatusEnum.NotFound;
return error;
}
if (DateTime.Now > checkout.Expires)
{
var error = CheckoutError.Expired;
error.Status = ResultStatusEnum.Invalid;
return error;
}
return new Result
{
Status = ResultStatusEnum.Valid
};
}
}
我想知道,这种设计是常用的吗?我觉得它可以变得更简单,我已经解决了复杂的问题,但我正在努力寻找可以改变和改进的地方和地方
【问题讨论】:
-
注意
error.Status = ResultStatusEnum.NotFound;,因为这会修改CheckoutError.NotFound实例。 -
@Vernou 可以修改
Status属性,因为在不同情况下,结果状态可能会有所不同。然后在控制器中使用它来了解要发回给用户的内容,即NotFound()或BadRequest() -
问题是同一个实例被重用了。在并行上下文(如 API)中,这会产生非常难以调试的错误。如果一个请求产生
NotFound和其他产生BadRequest同时执行,结果是不可预测的。 -
@Vernou 我不明白,你能举个例子吗?
-
@Vernou 是不是因为是静态类?我应该改变这个吗?
标签: c# validation error-handling