2017-10-08 46 views
1

今天我尝试了新的asp.net 2.0核心,但跑进使用我不是在IConfiguration配置constructor属性注入一个JSON配置文件有些麻烦。MVC 2.0的核心,如何通过配置使用appSettings.json文件

在asp.net 1.1核心我会在安装调试使用下面的代码:

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"]; 

但是在核心2.0它们改为IConfiguration并且它已经定义而且我看不出有什么办法可以使用配置在我的其他类,所以我对如何进行一无所知还挺。

的startupClass:

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": "[email protected]", 
     "mailFromAddress": "[email protected]" 
    } 
} 

我的自定义类想使用的设置(注意:这是我怎么会使用核心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}"); 
     } 
    } 
} 

任何帮助,将不胜感激,干杯!

回答

3

是的,ASP.NET Core 2.0改变了配置构建的方式。你现在需要使用IWebHostBuilder.ConfigureAppConfiguration方法。

添加这样的事情你IWebHost创作的Program.cs:

.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类作为一个依赖(或者任何其它类,由于DI机制) :

public class Startup 
{ 
    public IConfiguration Configuration { get; } 

    public Startup(IConfiguration configuration) 
    { 
     Configuration = configuration; 
    } 
    ... 
} 

存在描述这些变化的好文章:ASP.NET Core 2.0 Configuration Changes


关于您从自定义类访问设置的方式(如LocalMailService) - 请避免使用任何静态依赖关系。这个在ASP.NET Core中使用的DI概念被破坏了。阅读关于使用IOptions功能来代替。或者您可以再次使用DI并通过通过ctor获取IConfiguration实例。

+2

问题是关于如何在应用程序的其余部分使用配置。这并没有回答。 – NightOwl888

+0

@ NightOwl888谢谢,不太细心,已更新帖子 – Set

1

我认为你可以使用IOptions到配置文件传递给你的服务。 为您的配置创建一个类:

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; 
    } 

    //... 
} 
相关问题