asp.net 核心如何减少 class 耦合

asp.net core how decrease class coupling

如何优化 class 耦合?。这是我的 class 和 visual studio 显示 class 耦合是 16 高于最大标准 9 .

public class Auth:IAuth
    {
        public List<AuthDetail> GetAuths()
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json").Build();

            var auths = config.GetSection("Auth").GetChildren().ToList()
                .Select(x => new AuthDetail
                {
                    UserName = x.GetValue<string>("UserName"),
                    Source = x.GetValue<string>("Source"),
                    Password = x.GetValue<string>("Password")
                }).ToList();
            return auths;
        }
    }

d很难断定它在抱怨什么,但我想这只是你的 class 拥有的依赖级别(即它正在创建的东西),一般来说,它的知识必须有关于其他组件。例如,它必须知道 ConfigurationBuilder 及其工作原理。虽然它与 "class coupling" 无关,但它还需要知道有一个 appsettings.json 文件。你也有一些神奇的字符串,比如你的 Auth 部分,如果配置没有那样设置,整个事情都会失败。同样,这不一定 "class coupling",但它仍然是一个问题。

就我个人而言,我会把这整个东西扔进垃圾桶,至少根据它的当前状态。也许 Auth class 还需要做其他事情,但这部分几乎完全没用。

首先,您的配置应该外部化。这就是重点。我假设这是图书馆的一部分,如果是这样,图书馆不应该有这种知识。它们应该只依赖于抽象,这给了你可扩展性。

在您的实际 ASP.NET 核心应用程序中,您应该指定配置(默认情况下已包含 appsettings.json)。您还应该使用强类型配置,它可以代替所有这些逻辑。换句话说,这可以替换为:

services.Configure<AuthOptions>(Configuration.GetSection("Auth"));

然后你只需要以下 class:

public class AuthOptions
{
    public List<AuthDetail> Auths { get; set; }
}

然后,您就完成了。如果你的 Auth class 做其他事情,那么你可以简单地将这个 AuthOptions class 注入其中:

public class Auth : IAuth
{
    private readonly List<AuthDetail> _auths;

    public Auth(IOptions<AuthOptions> authOptions)
    {
        _auths = authOptions.Value?.Auths;
    }

    ...
}

然后,只需简单地使用 _auths 而不是调用 GetAuths。如果你想公开 "auths" publically(因为 GetAuths 是一个 public 方法),你可以使用自定义 [=51] 实现 属性 =],保留 GetAuths,但只拥有它 return _auths 或者只制作 _auths ivar public。