2015-06-09 17 views
9

Sto cercando di imparare ASP.NET 5. Lo sto usando su Mac OS X. In questo momento, ho un file config.json simile al seguente:ASP.NET 5 (vNext) - Configurazione

config.json

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

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

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

sto cercando di capire come caricare queste impostazioni in un file di configurazione in Startup.cs. Attualmente, ho un file che assomiglia a questo:

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

Poi, nel Startup.cs, ho il seguente:

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

Tuttavia, questo approccio non funziona Fondamentalmente, è come se non sapesse come mappare tra le classi .json e Config. Come faccio a fare questo?

Mi piacerebbe molto stare con l'approccio DI in modo da poter testare la mia app in modo più efficace.

Grazie

+0

@KamranShahid che non affronta questa domanda. –

risposta

4

Nella classe Startup, in primo luogo specificare le tue fonti di configurazione:

private readonly IConfiguration configuration; 

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

Il env.EnvironmentName è qualcosa di simile "development" o "production". Supponiamo che sia "development". Il framework proverà a caricare i valori di configurazione da config.development.json per primi. Se i valori richiesti non sono presenti o il file config.development.json non esiste, il framework proverà a estrarre i valori da config.json.

configurare il config.json sezioni come i servizi come questo:

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

Calling Configure<T>(IConfiguration) sul IServiceCollection registra il tipo IOptions<T> nel contenitore iniezione di dipendenza. Si noti che non è necessaria la classe AppConfiguration.

quindi specificare le dipendenze da iniettare in questo modo:

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

Questo è l'approccio che attualmente ho. Tuttavia, volevo avere una classe wrapper (ad esempio 'AppConfiguration') perché intendo avere più sezioni nel file di configurazione. Non voglio dover iniettare un sacco di dipendenze ogni volta. Nel tentativo di mantenere il mio codice pulito e conciso, voglio utilizzare una sola classe wrapper ('AppConfiguration') in modo che sia sufficiente iniettare una singola dipendenza. –

+0

@ZachTempleton Si prega di controllare l'aggiornamento. –

+0

L'approccio aggiornato non funziona per me. Stranamente, posso vedere i valori della proprietà in intellisense. Tuttavia, quanto segue conferma che DbSettings è nullo. '\t \t \t \t \t if (appConfiguration.Options.DbSettings == null) Console.WriteLine (" db config non è stato impostato "); else Console.WriteLine ("db app config is set"); ' –

1

Si può semplicemente accedere al valore della proprietà di configurazione Environment utilizzando Configuration classe come questa in qualsiasi punto dell'applicazione.

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

Ma se si vuole che l'accesso attraverso una proprietà di classe che si può fare questo

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

Nota non ho impostare il valore di Environment in setter, perché questo valore sarà in config.json quindi non è necessario impostare questo valore nel setter.

Per ulteriori dettagli dare un'occhiata a questo article.

Problemi correlati