从.NET Core/ASP.NET Core中的类库访问App密钥数据

HaB*_*aBo 4 c# asp.net .net-core asp.net-core

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

public static IConfigurationRoot Configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
Run Code Online (Sandbox Code Playgroud)

这是我在Microsoft文档中发现的,但这看起来非常多余.

项目中的启动类如下所示

 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"]));
        }
    }
Run Code Online (Sandbox Code Playgroud)

那么我应该如何在项目的每个类中注入这个" IConfigurationRoot ".我是否必须在每个类库中重复此Startup类?为什么这不是.NET Core Framework的一部分?

Tse*_*eng 8

建议的方法是使用Microsoft提供的选项模式,并在ASP.NET Core中大量使用.

基本上,您创建一个强类型类并在Startup.cs类中配置它.

public class MySettings 
{
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并在Startup课堂上初始化它.

// 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"]
});
Run Code Online (Sandbox Code Playgroud)

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

public class MyService : IMyService
{
    private readonly MySettings settings;

    public MyService(IOptions<MySettings> mysettings) 
    {
        this.settings = mySettings.Value;
    }
}
Run Code Online (Sandbox Code Playgroud)


Col*_*ica 3

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

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