mvc core 2.0,如何通过配置使用 appSettings.json 文件
mvc core 2.0, how to use an appSettings.json file via configuration
今天我正在尝试新的 asp.net 核心 2.0,但是 运行 使用 JSON 配置文件时遇到了一些麻烦,我没有在 IConfiguration 配置构造函数中注入 属性.
在 asp.net 核心 1.1 中,我将在 StartUp 中使用以下代码:
public static IConfigurationRoot Configuration;
Public Startup(IHostingEnvironment env) {
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appSettings.json", optional: false, reloadOnChange: true)
Configuration = builder.Build();
}
并且可以通过如下代码访问它:
private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"];
但是在 Core 2.0 中,他们更改为 IConfiguration 并且它已经被定义而且我看不出有任何方法可以在我的其他 classes 中使用该配置,所以我对如何进行有点无能为力.
启动类:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Mvc.Formatters;
using NLog.Web;
using NLog.Extensions.Logging;
using cityInfoTestApi.Services;
namespace cityInfoTestApi
{
public class Startup
{
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
Configuration = configuration;
env.ConfigureNLog("nlog.config");
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddMvcOptions(o => o.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()));
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddNLog();
app.AddNLogWeb();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStatusCodePages();
app.UseMvc();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
我的json文件:
{
"mailSetings": {
"mailToAddress": "admin@mycompany.com",
"mailFromAddress": "noreply@mycompany.com"
}
}
我的自定义 class 想要使用这些设置(注意这是我使用核心 1.1 的方式:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace cityInfoTestApi.Services
{
public class LocalMailService : IMailService
{
private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"];
private string _mailFrom = Startup.Configuration["mailSettings:mailFromAddress"];
public void Send(string subject, string message)
{
Debug.WriteLine($"Mail from {_mailFrom} to {_mailTo}, with LocalMailService");
Debug.WriteLine($"Subject: {subject}");
Debug.WriteLine($"Message: {message}");
}
}
}
任何帮助将不胜感激,干杯!
我认为您可以使用 IOptions 将配置文件传递给您的服务。
为您的配置创建一个 class:
public class MailSetings
{
public string MailToAddress {get;set;}
public string MailFromAddress {get;set}
public class MailSetings() { }
}
配置服务以使用这些设置:
//...
using Microsoft.Extensions.Configuration;
//...
public class Startup
{
//..
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MailSetings>(Configuration);
//...
}
现在您应该可以在您的服务构造函数中注入它了:
//...
using Microsoft.Extensions.Options;
public class LocalMailService : IMailService
{
private string _mailTo;
private string _mailFrom;
public LocalMailService(IOptions<MailSetings> options)
{
_mailTo = options.Value.MailToAddress;
_mailFrom = options.Value.MailFromAddress;
}
//...
}
是的,ASP.NETCore 2.0改变了配置构建的方式。您现在需要使用 IWebHostBuilder.ConfigureAppConfiguration
方法。
在 Program.cs 中为您的 IWebHost
创建内容添加这样的内容:
.ConfigureAppConfiguration((builderContext, config) =>
{
IHostingEnvironment env = builderContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
})
然后 IConfiguration
实例可以通过构造函数作为依赖注入到您的 Startup
class(或任何其他 class,感谢 DI 机制):
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
...
}
有一篇很好的文章描述了这些变化:ASP.NET Core 2.0 Configuration Changes
关于从自定义 classes(如 LocalMailService
)访问设置的方式 - 避免使用任何静态依赖项。 ASP.NET Core 中使用了这个损坏的 DI 概念。阅读有关使用 IOptions 功能的信息。或者您可以再次使用 DI 并通过 LocalMailService
.
中的 ctor 获取 IConfiguration
实例
今天我正在尝试新的 asp.net 核心 2.0,但是 运行 使用 JSON 配置文件时遇到了一些麻烦,我没有在 IConfiguration 配置构造函数中注入 属性.
在 asp.net 核心 1.1 中,我将在 StartUp 中使用以下代码:
public static IConfigurationRoot Configuration;
Public Startup(IHostingEnvironment env) {
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appSettings.json", optional: false, reloadOnChange: true)
Configuration = builder.Build();
}
并且可以通过如下代码访问它:
private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"];
但是在 Core 2.0 中,他们更改为 IConfiguration 并且它已经被定义而且我看不出有任何方法可以在我的其他 classes 中使用该配置,所以我对如何进行有点无能为力.
启动类:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Mvc.Formatters;
using NLog.Web;
using NLog.Extensions.Logging;
using cityInfoTestApi.Services;
namespace cityInfoTestApi
{
public class Startup
{
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
Configuration = configuration;
env.ConfigureNLog("nlog.config");
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddMvcOptions(o => o.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()));
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddNLog();
app.AddNLogWeb();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStatusCodePages();
app.UseMvc();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
我的json文件:
{
"mailSetings": {
"mailToAddress": "admin@mycompany.com",
"mailFromAddress": "noreply@mycompany.com"
}
}
我的自定义 class 想要使用这些设置(注意这是我使用核心 1.1 的方式:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace cityInfoTestApi.Services
{
public class LocalMailService : IMailService
{
private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"];
private string _mailFrom = Startup.Configuration["mailSettings:mailFromAddress"];
public void Send(string subject, string message)
{
Debug.WriteLine($"Mail from {_mailFrom} to {_mailTo}, with LocalMailService");
Debug.WriteLine($"Subject: {subject}");
Debug.WriteLine($"Message: {message}");
}
}
}
任何帮助将不胜感激,干杯!
我认为您可以使用 IOptions 将配置文件传递给您的服务。 为您的配置创建一个 class:
public class MailSetings
{
public string MailToAddress {get;set;}
public string MailFromAddress {get;set}
public class MailSetings() { }
}
配置服务以使用这些设置:
//...
using Microsoft.Extensions.Configuration;
//...
public class Startup
{
//..
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MailSetings>(Configuration);
//...
}
现在您应该可以在您的服务构造函数中注入它了:
//...
using Microsoft.Extensions.Options;
public class LocalMailService : IMailService
{
private string _mailTo;
private string _mailFrom;
public LocalMailService(IOptions<MailSetings> options)
{
_mailTo = options.Value.MailToAddress;
_mailFrom = options.Value.MailFromAddress;
}
//...
}
是的,ASP.NETCore 2.0改变了配置构建的方式。您现在需要使用 IWebHostBuilder.ConfigureAppConfiguration
方法。
在 Program.cs 中为您的 IWebHost
创建内容添加这样的内容:
.ConfigureAppConfiguration((builderContext, config) =>
{
IHostingEnvironment env = builderContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
})
然后 IConfiguration
实例可以通过构造函数作为依赖注入到您的 Startup
class(或任何其他 class,感谢 DI 机制):
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
...
}
有一篇很好的文章描述了这些变化:ASP.NET Core 2.0 Configuration Changes
关于从自定义 classes(如 LocalMailService
)访问设置的方式 - 避免使用任何静态依赖项。 ASP.NET Core 中使用了这个损坏的 DI 概念。阅读有关使用 IOptions 功能的信息。或者您可以再次使用 DI 并通过 LocalMailService
.
IConfiguration
实例