在.net核心类库中创建静态设置类

时间:2019-07-16 19:19:01

标签: c# asp.net-core

我邀请批评和反馈。如果愿意的话烤。 我在这里所做的事情感觉不对,我想知道为什么。

在.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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

鉴于上面的代码,您在每次调用配置时都在重新构建配置。您也可以将其设为单例。而且由于单身人士不好,所以其他事情可能是错误的。您的直觉觉得这是对的!

  1. 避免使用static类,直到您知道它们是静态的为止。
  2. 通常,像这样的常见“辅助”类违反了一个或多个SOLID原则。 (这可能是为什么您让代码的感觉错误)的原因
  

详细了解此类“帮助”类如何不遵循SOLID原则以及这些原则是什么in this blog article

如果不是利用static类,而是利用.NET Core的内置依赖项注入,我们可以轻松地将此抽象转换成一些符合SOLID原则的代码。当然,这不能解决您可以在另一个静态类中使用新的IContextSettings的问题,但是可以使您将此接口用作 头等公民 < / strong>直接在需要ContextUserID的位置,您只需在ControllerPageModel

中使用依赖项注入
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;
}

用法(RazorPages示例)

public class IndexModel : PageModel
{
    private readonly IContextSettings settings;

    public IndexModel(IContextSettings settings)
    {
        this.settings = settings;
    }
    public IActionResult OnGet()
    {
        var userId = settings.ContextUserID;
        return Page();
    }
}

感觉对...对吗?