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。
如何优化 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。