我邀请批评和反馈。如果愿意的话烤。 我在这里所做的事情感觉不对,我想知道为什么。
在.net core中创建静态设置类,该类可以从appsettings.json文件返回设置。它确实可以工作,但是它在每次访问设置时都使用ConfigurationBuilder。
public static class GeneralSettings
{
private static IConfigurationRoot Configuration = StartConfig();
private static IConfigurationRoot StartConfig()
{
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
return configBuilder.Build();
}
public static string ContextUserID
{
get
{
string result =
Configuration.GetSection("AppSettings").GetSection("ContextUserID").Value;
return result;
}
}
}
答案 0 :(得分:1)
鉴于上面的代码,您在每次调用配置时都在重新构建配置。您也可以将其设为单例。而且由于单身人士不好,所以其他事情可能是错误的。您的直觉觉得这是对的!
static
类,直到您知道它们是静态的为止。详细了解此类“帮助”类如何不遵循SOLID原则以及这些原则是什么in this blog article
如果不是利用static
类,而是利用.NET Core的内置依赖项注入,我们可以轻松地将此抽象转换成一些符合SOLID原则的代码。当然,这不能解决您可以在另一个静态类中使用新的IContextSettings
的问题,但是可以使您将此接口用作 头等公民 < / strong>直接在需要ContextUserID
的位置,您只需在Controller
或PageModel
public interface IContextSettings
{
string ContextUserID { get; }
}
public class ContextSettings : IContextSettings
{
private IConfiguration configuration;
public ContextSettings(IConfiguration configuration)
{
this.configuration = configuration;
}
public string ContextUserID => configuration.GetSection("AppSettings").GetSection("ContextUserID").Value;
}
public class IndexModel : PageModel
{
private readonly IContextSettings settings;
public IndexModel(IContextSettings settings)
{
this.settings = settings;
}
public IActionResult OnGet()
{
var userId = settings.ContextUserID;
return Page();
}
}
感觉对...对吗?