我想知道是否有更简洁的方法来处理保护子句(在本例中为 C#)。
假设我有一个像这样的虚拟代码,带有保护子句和多个存储库调用来加载我们需要处理的正确数据:
public Result Method1(string id)
{
if (string.IsNullOrWhiteSpace(id))
return ArgumentError(nameof(id));
var dto1 = _repository1.Get(id);
if (dto1 == null)
return NotFoundError();
var dto2 = _repository2.Get(dto1.Dto2Id);
if (dto2 == null)
return NotFoundError();
var dto3 = _repository3.Get(dto2.Dto3Id);
if (dto3 == null)
return NotFoundError();
Handle(dto3);
}
(我们的应用程序中不处理异常 - 结果将在 Webpipeline 过滤器中处理,以映射到正确的 Http 响应代码)。
使用更简洁的代码(并且响应应该始终是 NotFoundError),我可以用这样的方式重构该方法:
public Result Method1(string id)
{
var guardResult = Guard(id);
if (guardResult.IsFailed)
return guardResult;
var dto3 = LoadDto3(id);
if (dto3 == null)
return NotFoundError();
Handle(dto3);
}
但是如果我必须退出 Method1,那仍然是 3 行验证代码。我的问题是,是否有可能(除了例外)我可以从 Method Guard() 中退出 Method1()。
所以我的意思是我可以拥有这样的东西:
public Result Method1(string id)
{
Guard(id);
var dto3 = LoadDto3(id);
Handle(dto3);
}
如果 Guard(id) 或 LoadDto3(id) 产生错误,它们会直接退出 Method1 吗?
我想要这个的原因是,在公共方法中,我喜欢清楚地了解正在发生的事情(仅方法调用),这样就可以清晰地读取该方法的工作流程 - 甚至是来自企业可以了解这里发生的事情
谢谢您的回答
重构为更小的方法,但我仍然没有摆脱代码中的 if 语句
也许您的方法/类的某种自定义属性适合? https://learn.microsoft.com/en-us/dotnet/standard/attributes/writing-custom-attributes
我正在使用类似的东西来检查服务是否配置为正常工作
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeAttribute : Attribute, IActionFilter
{
public static readonly bool IsAvaible = SettingsHelper.GetAppSettings().GetValue("Avaliable", false);
public AuthorizeAttribute()
{
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
public void OnActionExecuting(ActionExecutingContext context)
{
if (!IsAvaible)
context.Result = new NotFoundResult();
}
}