C# 如何从appsettings.js加载自定义设置

C# 如何从appsettings.js加载自定义设置,c#,asp.net,asp.net-core,appsettings,C#,Asp.net,Asp.net Core,Appsettings,我已经在我的第一个ASP.NET(Core 2.1)应用程序中添加了一些自定义设置,但我不知道如何从C#访问它。我想我没有正确初始化它,有人能看一下吗 appsettings.js: "DatabaseSettings": { "Hostname": "localhost", "Port": "12345", "DbName": "myDatabase" } 下面是它的课程: public class DatabaseSettings { public str

我已经在我的第一个ASP.NET(Core 2.1)应用程序中添加了一些自定义设置,但我不知道如何从C#访问它。我想我没有正确初始化它,有人能看一下吗

appsettings.js:

"DatabaseSettings": 
{
    "Hostname": "localhost",
    "Port": "12345",
    "DbName": "myDatabase"
}
下面是它的课程:

public class DatabaseSettings
{
    public string Hostname { get; set; }
    public int Port { get; set; }
    public string DbName { get; set; }
}
Startup.cs:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.Configure<DatabaseSettings>(Configuration.GetSection("DatabaseSettings"));
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
            app.UseDeveloperExceptionPage();
        app.UseMvc();
        var databaseSettings = Configuration.Get<DatabaseSettings>();
        Mongo.Initialize("mongodb://" + databaseSettings.Hostname + ":" + databaseSettings.Port, databaseSettings.DbName);
    }
}
公共类启动
{
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
services.Configure(Configuration.GetSection(“数据库设置”));
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseMvc();
var databaseSettings=Configuration.Get();
初始化(“mongodb://”+databaseSettings.Hostname+:“+databaseSettings.Port,databaseSettings.DbName);
}
}

属性返回null。

使用
服务.Configure()
添加设置后,可以使用
IOptions
将其注入到其他类中。您还可以通过在启动类的
Configure()
方法中指定
IOptions
来引用它。就你而言:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions<DatabaseSettings> settings)
{
    if (env.IsDevelopment())
        app.UseDeveloperExceptionPage();
    app.UseMvc();
    var databaseSettings = settings.Value;
    Mongo.Initialize("mongodb://" + databaseSettings.Hostname + ":" + databaseSettings.Port, databaseSettings.DbName);
}
public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、IOPS设置)
{
if(env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseMvc();
var databaseSettings=settings.Value;
初始化(“mongodb://”+databaseSettings.Hostname+:“+databaseSettings.Port,databaseSettings.DbName);
}

只需将配置变量设置为全局变量即可。你可以把它放在任何启动的地方

public class Startup
{
    public IConfiguration Configuration { get; set; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
   public void ConfigureServices(IServiceCollection services)
   {
    services.AddMvc();
    services.Configure<DatabaseSettings>(Configuration.GetSection("DatabaseSettings"));
   }

  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
    if (env.IsDevelopment())
        app.UseDeveloperExceptionPage();
    app.UseMvc();
    var settingsSection = Configuration.GetSection("DatabaseSettings");
    var settings = settingsSection.Get<DatabaseSettings>();
    Mongo.Initialize("mongodb://" + settings.Hostname + ":" + settings.Port, settings.DbName);
  }
}
公共类启动
{
公共IConfiguration配置{get;set;}
公共启动(IConfiguration配置)
{
配置=配置;
}
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
services.Configure(Configuration.GetSection(“数据库设置”));
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseMvc();
var settingsSection=Configuration.GetSection(“数据库设置”);
var settings=settingsSection.Get();
初始化(“mongodb://”+settings.Hostname+:“+settings.Port,settings.DbName);
}
}
添加到 你可以用

var sett = new DatabaseSettings();
Configuration.GetSection("DatabaseSettings").Bind(sett);
var hostname = Configuration.GetSection("DatabaseSettings:Hostname");
或者,如果您想获得单个值,可以使用

var sett = new DatabaseSettings();
Configuration.GetSection("DatabaseSettings").Bind(sett);
var hostname = Configuration.GetSection("DatabaseSettings:Hostname");

IOptions
完全没有必要。使用
services.Configure
的全部要点是允许您直接注入配置类。如果有任何问题,请使用
IOptionsSnapshot
,因为这至少为您提供了配置重新加载支持,不过对于这个特定的用例,这不会有什么区别,因为这都是在启动过程中发生的。@ChrisPratt,是的,对于正常的依赖项注入,您可以/应该直接将类注入构造函数中!但是,如果您试图在启动时将类(不带
IOptions
)仅用于
Configure()
方法,它将抛出一个异常,说明它无法解析
T
类型的服务。最佳答案,以及在ASP.NET核心应用程序项目模板中默认处理它的方式。然而,称之为“全球”并不准确。它仍然是一个局部的,仅限于类实例。它是全局的,而且如果你想在你的.net核心项目的任何页面中使用这些值,你只需要这样做@配置[“消息”]尝试一下。。。它真的有效!但是您需要使用@InjectIConfigurationConfigurationUmm.注入IConfiguration。。不,这不是全球性的。它存在于您的视图中,因为您正在注入它。与将其注入类构造函数的情况相同。它没有使用启动时的属性。