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的一部分?
建议的方法是使用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)
根据面向对象编程中的信息隐藏原则,大多数类不需要访问您的应用程序配置。只有您的主应用程序类才需要直接访问此信息。您的类库应该公开属性和方法,以根据调用者认为必要的任何标准来改变它们的行为,并且您的应用程序应该使用其配置来设置正确的属性。
例如,DateBox 不需要知道时区信息如何存储在应用程序配置文件中 - 它需要知道的是它有一个 DateBox.TimeZone 属性,可以在运行时检查该属性以了解它所在的时区。
归档时间: |
|
查看次数: |
4175 次 |
最近记录: |