C#中是否可以“退出”调用方法而不抛出异常?

问题描述 投票:0回答:1

我想知道是否有更简洁的方法来处理保护子句(在本例中为 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 语句

c# .net coding-style
1个回答
0
投票

也许您的方法/类的某种自定义属性适合? 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(); 
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.