首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问ASP.NET核心中任何类中的配置?

如何访问ASP.NET核心中任何类中的配置?
EN

Stack Overflow用户
提问于 2016-08-30 15:45:22
回答 10查看 236.5K关注 0票数 198

我已经通过了配置文档 on ASP.NET核心。文档显示,您可以从应用程序中的任何位置访问配置。

下面是由模板创建的Startup.cs

代码语言:javascript
复制
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中我们配置了所有的设置,Startup.cs也有一个名为Configuration的属性

我无法理解的是,您如何在控制器或应用程序中的任何地方访问此配置?MS建议使用期权模式,但是我只有4-5个键值对,所以我不想使用选项模式。我只想访问应用程序中的配置。我怎么在任何一堂课上注射它?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2016-08-30 16:43:12

更新

使用ASP.NET Core2.0,自动将在依赖注入容器中添加应用程序的IConfiguration实例。这也与ConfigureAppConfigurationWebHostBuilder上一起工作。

例如:

代码语言:javascript
复制
public static void Main(string[] args)
{
    var host = WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder =>
        {
            builder.AddIniFile("foo.ini");
        })
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

它就像将IConfiguration实例添加到服务集合中一样简单,就像ConfigureServices中的单个对象一样

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
   services.AddSingleton<IConfiguration>(Configuration);

   // ...
}

其中ConfigurationStartup类中的实例。

这允许您在任何控制器或服务中注入IConfiguration

代码语言:javascript
复制
public class HomeController
{
   public HomeController(IConfiguration configuration)
   {
      // Use IConfiguration instance
   }
}
票数 201
EN

Stack Overflow用户

发布于 2019-03-27 20:46:19

正确的方法:

在.NET核心中,您可以将IConfiguration作为参数注入您的类构造函数,并且它是可用的。

代码语言:javascript
复制
public class MyClass 
{
    private IConfiguration configuration;
    public MyClass(IConfiguration configuration)
    {
        ConnectionString = new configuration.GetValue<string>("ConnectionString");
    }

现在,当您想要创建类的一个实例时,由于您的类被注入了IConfiguration,您将不能只执行new MyClass(),因为它需要在构造函数中注入一个IConfiguration参数,因此,您还需要将类注入到注入链,这意味着两个简单步骤:

1)将类/es-要在其中使用IConfiguration的类/es添加到ConfigureServices()方法的ConfigureServices()方法的Startup.cs

代码语言:javascript
复制
services.AddTransient<MyClass>();

2)定义一个实例--比如说在Controller中,并使用构造函数注入它:

代码语言:javascript
复制
public class MyController : ControllerBase
{
    private MyClass _myClass;
    public MyController(MyClass myClass)
    {
        _myClass = myClass;
    }

现在你应该可以自由地享受你的_myClass.configuration了.

另一个选项:

如果您仍然在寻找一种不需要将类注入控制器就可以使用的方法,则可以将其存储在static class中,您将在Startup.cs中配置它,如下所示:

代码语言:javascript
复制
public static class MyAppData
{
    public static IConfiguration Configuration;
}

您的Startup构造函数应该如下所示:

代码语言:javascript
复制
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
    MyAppData.Configuration = configuration;
}

然后在程序中的任何地方使用MyAppData.Configuration

不要问我为什么第一种选择是正确的,我可以看到,经验丰富的开发人员总是避免垃圾数据的沿途,这是众所周知的,这不是最好的做法是在内存中有大量的数据始终可用,这对性能和开发都没有好处,也许只有你需要的东西也更安全。

票数 85
EN

Stack Overflow用户

发布于 2017-10-12 17:12:50

我知道这是旧的,但是考虑到IOptions模式的实现相对简单:

  1. 使用匹配配置中设置的公共get/set属性初始化 公共类ApplicationSettings {公共字符串UrlBasePath { get;set;}}
  2. 注册您的设置 公开无效ConfigureServices(IServiceCollection服务){.services.Configure(Configuration.GetSection("ApplicationSettings"));…}
  3. 经IOptions注射 公共类HomeController { public HomeController(IOptions appSettings) {.appSettings.Value.UrlBasePath . //或更好的实践创建只读私有引用}}

我不知道你为什么不这么做。

票数 48
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39231951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档