2017-10-08 45 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; 
    } 

    //... 
} 
相關問題