На самом деле читайте AppSettings в фазе ConfigureServices в ASP.NET Core
Мне нужно настроить несколько зависимостей (служб) в методе ConfigureServices
в веб-приложении ASP.NET Core 1.0.
Проблема в том, что на основе новой конфигурации 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
).
Ответы
Ответ 1
Таким способом вы можете получить введенные настройки из appSettings.json
прямо в методе ConfigureServices
:
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, мы выполняем настройку конфигурации в классе Program
при сборке экземпляра WebHost
. Пример такой настройки:
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; }
...
}
Ответ 3
Вы можете получить доступ к значениям appsettings.json с помощью Configuration["ConfigSection:ConfigValue"])
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;"
}
}