2015-06-09 88 views
9

我想學習ASP.NET 5.我在Mac OS X上使用它。此時,我有一個config.json文件,如下所示:ASP.NET 5(vNext) - 配置

config.json

{ 
    "AppSettings": { 
     "Environment":"dev" 
    }, 

    "DbSettings": { 
     "AppConnectionString": "..." 
    }, 

    "EmailSettings": { 
     "EmailApiKey": "..."   
    }, 
} 

我試圖弄清楚如何將這些設置加載到Startup.cs的配置文件。目前,我有一個看起來像這樣的文件:

Configuration.cs

public class AppConfiguration 
{ 
    public AppSettings AppSettings { get; set; } 

    public DbSettings DbSettings { get; set; } 

    public EmailSettings EmailSettings { get; set; }   
} 

public class AppSettings 
{ 
    public string Environment { get; set; } 
} 

public class DbSettings 
{ 
    public string AppConnectionString { get; set; } 
} 

public class EmailSettings 
{ 
    public string MandrillApiKey { get; set; } 
} 

然後,在Startup.cs,我有以下幾點:

public IConfiguration Configuration { get; set; } 
public Startup(IHostingEnvironment environment) 
{ 
    var configuration = new Configuration().AddJsonFile("config.json"); 
    Configuration = configuration; 
} 

public void ConfigureServices(IServiceCollection services) 
{ 
    services.Configure<AppConfiguration>(Configuration); 
} 

然而,這種方法不起作用。基本上,它像它不知道如何在.json和Config類之間進行映射。我該怎麼做呢?

我真的很想繼續使用DI方法,所以我可以更有效地測試我的應用程序。

謝謝

+0

@KamranShahid這並沒有解決這個問題。 –

回答

4

在你Startup一流,指定配置源:

private readonly IConfiguration configuration; 

public Startup(IHostingEnvironment env) 
{ 
    configuration = new Configuration() 
     .AddJsonFile("config.json") 
     .AddJsonFile($"config.{env.EnvironmentName}.json", optional: true); 
} 

env.EnvironmentName是一樣的東西"development""production"。假設它是"development"。該框架將嘗試首先從config.development.json提取配置值。如果請求的值不存在,或者config.development.json文件不存在,那麼框架將嘗試從config.json中提取值。

配置config.json部分爲這樣的服務:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.Configure<AppSettings>(configuration.GetSubKey("AppSettings")); 
    services.Configure<DbSettings>(configuration.GetSubKey("DbSettings")); 
    services.Configure<EmailSettings>(configuration.GetSubKey("EmailSettings")); 
} 

呼籲IServiceCollectionConfigure<T>(IConfiguration)登記在依賴注入容器類型IOptions<T>。請注意,你不需要你的AppConfiguration類。

然後指定依賴被注入這樣的:

public class EmailController : Controller 
{ 
    private readonly IOptions<EmailSettings> emailSettings; 

    public EmailController (IOptions<EmailSettings> emailSettings) 
    { 
     this.emailSettings = emailSettings; 
    } 

    public IActionResult Index() 
    { 
     string apiKey = emailSettings.Options.EmailApiKey; 
     ... 
    } 
} 
+0

這是我目前的方法。然而,我想有一個包裝類(即'AppConfiguration'),因爲我打算在配置文件中包含更多的部分。我不想每次都要注入一堆依賴項。爲了保持我的代碼乾淨簡潔,我想使用一個包裝類('AppConfiguration'),這樣我只需要注入一個依賴關係。 –

+0

@ZachTempleton請檢查更新。 –

+0

更新的方法不適用於我。奇怪的是,我可以在intellisense中看到屬性值。但是,以下證實DbSettings爲空。 '\t \t \t \t \t if(appConfiguration.Options.DbSettings == null) Console.WriteLine(「db config has not set」); else Console.WriteLine(「db app config is set」); ' –

1

你可以簡單地通過使用Configuration類喜歡在你的應用程序這在任何地方訪問config屬性Environment的價值。

var environment = Configuration["AppSettings:Environment"]; 

但是,如果你想讓它通過類的屬性來訪問,你可以做到這一點

public class AppSettings 
{ 
public string Environment 
{ 
get 
{ 
    return new Configuration().Get("AppSettings:Environment").ToString(); 
} 
set; 
} 
} 

注意我沒有設置Environment值在二傳,因爲此值將在config.json因此不需要在setter中設置此值。

欲瞭解更多詳情,看看article

相關問題