【问题标题】:Access appsettings.json values in controller classes访问控制器类中的 appsettings.json 值
【发布时间】:2016-11-16 11:40:25
【问题描述】:

无法弄清楚如何在 startup.cs 之外读取 appsettings.json 值。例如,我想做的是在 _Layout.cshtml 中,从配置中添加站点名称:

例如:

ViewData["SiteName"] = Configuration.GetValue<string>("SiteSettings:SiteName");

甚至更好:

public class GlobalVars {
    public static string SiteName => Configuration.GetValue<string>("SiteSettings:SiteName");
}

到目前为止,这是我的代码:

[appsettings.json]

"SiteSettings": {
    "SiteName": "MySiteName"
}

[startup.cs]

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)
        .AddEnvironmentVariables();
    Configuration = builder.Build();

    var siteName = Configuration.GetValue<string>("SiteSettings:SiteName");
}

public IConfigurationRoot Configuration { get; }

也许我读错了文档,但我似乎无法在 Startup 类之外公开 Configuration 对象。

【问题讨论】:

标签: c# asp.net-core-mvc appsettings


【解决方案1】:

在您的 Startup.cs 中

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IConfiguration>(Configuration);
    }

然后在你的控制器中:

public class ValuesController : Controller
{
    IConfiguration configuration;

    public ValuesController(IConfiguration configuration)
    {
        this.configuration = configuration;
    }
}

【讨论】:

  • 效果很好。您是否知道在 GlobalVars.cs 之类的东西中静态引用它的方法,所以我不必在每个控制器的顶部声明它?
  • 您可以创建一个单例并从中公开配置属性。确保它始终是同一个实例。然后你可以在 Startup 中使用它,而不是在那里创建一个新的 Configuration 实例。这将使该属性可供其他图层使用。
  • 这实际上是对 IConfiguration 的滥用。控制器不应该关心配置中间件。它不应该仅仅为了传递一个设置而要求它启动并运行。 DI 应该注册并将设置注入控制器,可能以 IOption 对象的形式
猜你喜欢
  • 2022-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2021-11-12
  • 2016-12-11
相关资源
最近更新 更多