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

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

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

这是我在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(options => options.UseSqlServer(Configuration["Data:MyDb:ConnectionString"])); } } 

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

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

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

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

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

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

并在Startup类中初始化它。

 // load it directly from the appsettings.json "mysettings" section services.Configure(Configuration.GetSection("mysettings")); // do it manually services.Configure(new MySettings { Value1 = "Some Value", Value2 = Configuration["somevalue:from:appsettings"] }); 

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

 public class MyService : IMyService { private readonly MySettings settings; public MyService(IOptions mysettings) { this.settings = mySettings.Value; } }