2015-06-09 2 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")); 
} 

Вызов Configure<T>(IConfiguration) на IServiceCollection регистрирует тип 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 имеет значение NULL. '\t \t \t \t \t if (appConfiguration.Options.DbSettings == null) Console.WriteLine (« Конфигурация db не установлена ​​»); еще Console.WriteLine («Конфигурация приложения db установлена»); ' –

0

Try использование OptionsModel. он позволяет привязать сильную типизированную модель к конфигурации.

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

var configuration = new Configuration().AddJsonFile("config.json"); 
var opt = ConfigurationBinder.Bind<AppSettings>(configuration); 
opt.SomeSetting 

Пример: https://github.com/aspnet/Options/blob/dev/test/Microsoft.Framework.OptionsModel.Test/OptionsTest.cs#L80

1

Вы можете просто получить доступ к значению свойства настроек Environment с помощью Configuration класса, как этот в любом месте вашего приложения.

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

Но если вы хотите, чтобы получить доступ через свойство класса вы можете сделать это

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

Примечание Я не установил значение Environment в инкубаторе, так как это значение будет config.json, поэтому нет необходимости устанавливать это значение в сеттере.

Для получения более подробной информации см. Это article.

Смежные вопросы