在 ASP.NET Core 的 ConfigureServices 阶段实际读取 AppSettings
Posted
技术标签:
【中文标题】在 ASP.NET Core 的 ConfigureServices 阶段实际读取 AppSettings【英文标题】:Actually read AppSettings in ConfigureServices phase in ASP.NET Core 【发布时间】:2017-03-21 02:44:03 【问题描述】:我需要在 ASP.NET Core 1.0 Web 应用程序的 ConfigureServices
方法中设置一些依赖项(服务)。
问题是基于新的 JSON 配置,我需要设置一个服务或其他服务。
我似乎无法真正阅读应用程序生命周期的ConfigureServices
阶段的设置:
public void ConfigureServices(IServiceCollection services)
var section = Configuration.GetSection("MySettings"); // this does not actually hold the settings
services.Configure<MySettingsClass>(section); // this is a setup instruction, I can't actually get a MySettingsClass instance with the settings
// ...
// set up services
services.AddSingleton(typeof(ISomething), typeof(ConcreteSomething));
我需要真正阅读该部分并决定注册ISomething
的内容(可能与ConcreteSomething
不同)。
【问题讨论】:
见***.com/q/40397648/5426333 @ademcaglin:谢谢!就是这样。我投票结束我自己的问题作为那个问题的副本:) 链接的答案是从配置文件中获取值,而不是从 appsettings.json 文件中获取值。 ASP.NET Core Configuration Section in Startup的可能重复 【参考方案1】:这就是您可以在ConfigureServices
方法中从appSettings.json
获取键入设置的方式:
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration get;
public void ConfigureServices(IServiceCollection services)
services.Configure<MySettings>(Configuration.GetSection(nameof(MySettings)));
services.AddSingleton(Configuration);
// ...
var settings = Configuration.GetSection(nameof(MySettings)).Get<MySettings>();
int maxNumberOfSomething = settings.MaxNumberOfSomething;
// ...
// ...
【讨论】:
【参考方案2】:从 ASP.NET Core 2.0 开始,我们在构建 WebHost
实例时在 Program
类中进行配置设置。此类设置示例:
return new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((builderContext, config) =>
IHostingEnvironment env = builderContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.env.EnvironmentName.json", optional: true, reloadOnChange: true);
)
其中,这允许直接在Startup
类中使用配置,通过构造函数注入获取IConfiguration
的实例(谢谢,内置 DI 容器):
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration get;
...
【讨论】:
是的!为我工作。最后我可以从 json 条目中获取我的东西来准备我的服务:\ 在 IIS 下托管 ASP.NET Core 2.1 应用程序时如何工作?WebHostBuilder
不会被使用,那么传递给Startup
的构造函数的IConfiguration configuration
是什么?【参考方案3】:
您可以通过Configuration["ConfigSection:ConfigValue"])
访问 appsettings.json 值
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration get;
public void ConfigureServices(IServiceCollection services)
services.AddDbContext<MyContext>(o =>
o.UseSqlServer(Configuration["AppSettings:SqlConn"]));
appsettings.json
"Logging":
"LogLevel":
"Default": "Warning",
"System": "Information",
"Microsoft": "Warning"
,
"AppSettings":
"SqlConn": "Data Source=MyServer\\MyInstance;Initial Catalog=MyDb;User ID=sa;Password=password;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;"
【讨论】:
不,对象配置为空【参考方案4】:appsettings.json 文件:
"MyApp":
"Jwt":
"JwtSecretConfigKey": "jwtSecretConfigKey",
"Issuer": "appIssuer",
"Audience": "appAudience",
"ExpireMinutes": 60
添加一个类来绑定“MyApp”的Jwt部分 ...
public class JwtConfig
public string JwtSecretConfigKey get; set;
public string Issuer get; set;
public string Audience get; set;
public int ExpireMinutes get; set;
在 ConfigureServices 方法中:
//reading config from appsettings.json
var jwtConfig = Configuration.GetSection("MyApp:Jwt").Get<JwtConfig>();
//using config data ....
services.AddJwt(new AddJwtOptions(jwtConfig.JwtSecretConfigKey, jwtConfig.Issuer, jwtConfig.Audience, jwtConfig.ExpireMinutes));
下面的代码和上面的一样。它也有效...
var jwtConfig = Configuration.GetSection("MyApp").GetSection("Jwt").Get<JwtConfig>();
希望这会有所帮助..
【讨论】:
【参考方案5】:尝试下一个:
var settings = new MySettings();
Configuration.GetSection(nameof(MySettings)).Bind(settings);
【讨论】:
以上是关于在 ASP.NET Core 的 ConfigureServices 阶段实际读取 AppSettings的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core学习笔记 第一篇 ASP.NET Core初探
ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存