从 .NET Core / ASP.NET Core 中的 class 库访问应用密钥数据

Access App key data from class libraries in .NET Core / ASP.NET Core

要访问 class 库中的 App Key,我们是否需要在每个 class 库和 class 我们需要访问 AppKey 的地方执行以下代码?

public static IConfigurationRoot Configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();

这是我在 Microsoft docs 中找到的,但这看起来很多余。

在如下项目中启动class

 public class Startup
    {
        public IConfigurationRoot Configuration { get; set; }

        public Startup()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json");

            Configuration = builder.Build();
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework().AddEntityFrameworkSqlServer()
                .AddDbContext<DbContext>(options =>
                    options.UseSqlServer(Configuration["Data:MyDb:ConnectionString"]));
        }
    }

那我应该如何在每个class项目中注入这个“IConfigurationRoot”。我是否必须在每个 class 库中重复启动 class?为什么这不是 .NET Core Framework 的一部分?

根据面向对象编程中的信息隐藏原则,大多数 classes 应该不需要访问您的应用程序配置。只有您的主应用程序 class 需要直接访问此信息。您的 class 库应该根据调用者认为必要的任何标准公开属性和方法来改变它们的行为,并且您的应用程序应该使用其配置来设置正确的属性。

例如,DateBox 不需要知道时区信息是如何存储在您的应用程序配置文件中的 - 它只需要知道它有一个 DateBox.TimeZone 属性 它可以在运行时检查它所在的时区。

推荐的方法是使用 options pattern,由 Microsoft 提供并在 ASP.NET Core 中大量使用。

基本上你创建一个强类型 class 并在 Startup.cs class 中配置它。

public class MySettings 
{
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}

并在 Startup class.

中初始化它
// load it directly from the appsettings.json "mysettings" section
services.Configure<MySettings>(Configuration.GetSection("mysettings"));

// do it manually
services.Configure<MySettings>(new MySettings 
{
    Value1 = "Some Value",
    Value2 = Configuration["somevalue:from:appsettings"]
});

然后在你需要的任何地方注入这些选项。

public class MyService : IMyService
{
    private readonly MySettings settings;

    public MyService(IOptions<MySettings> mysettings) 
    {
        this.settings = mySettings.Value;
    }
}