首页 > 解决方案 > asp.net core如何减少类耦合

问题描述

我如何优化类耦合?这是我的班级和visual studio show班级的耦合度是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;
        }
    }

标签: c#asp.net-coresolid-principles

解决方案


d很难准确地说出它在上下文中抱怨什么,但我想这只是你的类拥有的依赖级别(即它正在创建的东西),一般来说,它必须具备关于其他组件的知识。例如,它必须了解它ConfigurationBuilder以及它是如何工作的。虽然它与“类耦合”无关,但它也需要知道有一个appsettings.json文件。你也有一些魔法字符串,比如你的Auth部分,如果配置不是这样设置的,整个事情都会失败。同样,这不一定是“类耦合”,但它仍然是一个问题。

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

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

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

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

然后你只需要以下类:

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

而且,你已经完成了。如果您的Auth班级正在做其他事情,那么您可以简单地将这个AuthOptions班级注入其中:

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

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

    ...
}

然后,只需简单地使用_auths而不是调用GetAuths. 如果您想公开“auths”(因为GetAuths它是一个公共方法),您可以使用自定义 getter 实现一个属性,保留GetAuths但只是让它返回_auths,或者只是将_authsivar 公开。


推荐阅读