Как получить доступ к конфигурации в любом классе в ASP.NET ядро?
Я прошел через документация по конфигурации on ASP.NET ядро. В документации говорится, что вы можете получить доступ к конфигурации из любого места приложения.
Ниже приведен запуск.cs создан по шаблону
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsEnvironment("Development"))
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
}
}
Так Startup.cs мы настраиваем все настройки, запуск.CS также имеет свойство с именем Configuration
что я не в состоянии понять, как вы получаете доступ к этой конфигурации в контроллере или в любом месте приложения? МС рекомендуем использовать параметры pattern но у меня есть только 4-5 пар ключ-значение, поэтому я хотел бы не использовать шаблон опций. Я просто хотел иметь доступ к конфигурации в приложении. Как мне ввести его в любом классе?
4 ответов:
обновление
использование ASP.NET ядро 2.0 будет автоматически добавить
IConfigurationэкземпляр вашего приложения в контейнере инъекции зависимостей. Это также работает в сочетании сConfigureAppConfigurationнаWebHostBuilder.например:
public static void Main(string[] args) { var host = WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration(builder => { builder.AddIniFile("foo.ini"); }) .UseStartup<Startup>() .Build(); host.Run(); }
это так же просто, как добавление
IConfigurationэкземпляр коллекции служб как одноэлементный объект вConfigureServices:public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IConfiguration>(Configuration); // ... }здесь
Configurationэкземпляр вStartupкласса.это позволяет вводить
IConfigurationв любом контроллере или услуги:public class HomeController { public HomeController(IConfiguration configuration) { // Use IConfiguration instance } }
Я знаю, что это старый, но учитывая, что шаблоны IOptions относительно просты в реализации:
класс с общедоступными свойствами get / set, которые соответствуют настройкам в конфигурации
public class ApplicationSettings { public string UrlBasePath { get; set; } }регистрация параметров
public void ConfigureServices(IServiceCollection services) { ... services.Configure<ApplicationSettings>(Configuration.GetSection("ApplicationSettings")); ... }впрысните через IOptions
public class HomeController { public HomeController(IOptions<ApplicationSettings> appSettings) { ... appSettings.Value.UrlBasePath ... // or better practice create a readonly private reference } }Я не уверен, почему бы вам просто не сделать это.
Я делаю это так в данный момент:
// Requires NuGet package Microsoft.Extensions.Configuration.Json using Microsoft.Extensions.Configuration; using System.IO; namespace ImagesToMssql.AppsettingsJson { public static class AppSettingsJson { public static IConfigurationRoot GetAppSettings() { string applicationExeDirectory = ApplicationExeDirectory(); var builder = new ConfigurationBuilder() .SetBasePath(applicationExeDirectory) .AddJsonFile("appsettings.json"); return builder.Build(); } private static string ApplicationExeDirectory() { var location = System.Reflection.Assembly.GetExecutingAssembly().Location; var appRoot = Path.GetDirectoryName(location); return appRoot; } } }и затем я использую это, где мне нужно получить данные из appsettings.JSON-файл:
var appSettingsJson = AppSettingsJson.GetAppSettings(); // appSettingsJson["keyName"]
Я заглянул в образец шаблона параметров и увидел следующее:
public class Startup { public Startup(IConfiguration config) { // Configuration from appsettings.json has already been loaded by // CreateDefaultBuilder on WebHost in Program.cs. Use DI to load // the configuration into the Configuration property. Configuration = config; } ... }при добавлении Iconfiguration в конструктор моего класса, я мог бы получить доступ к параметрам конфигурации через DI.
пример:
public class MyClass{ private Iconfiguration _config; public MyClass(Iconfiguration config){ _config = config; } ... // access _config["myAppSetting"] anywhere in this class }
Comments