2016-07-15 119 views
12

Sto tentando di accedere al file appsetting.json da una libreria di classi. Finora la soluzione che ho trovato è quella di creare una classe di configurazione che implementa l'interfaccia IConfiguration da Microsoft.Extensions.Configuration e aggiungere il file json in classe e leggere dallo stesso.Accesso dalla libreria di classi a appsetting.json in Asp.net-core

var configuration = new Configuration(); 
configuration.AddJsonFile("appsetting.json"); 
var connectionString= configuration.Get("connectionString"); 

Questo sembra essere cattiva opzione come dobbiamo aggiungere il file JSON ogni volta che abbiamo per accedere alla configurazione appsetting. Non abbiamo alternative come ConfigurationManager in ASP.NET.

+0

Eventuali duplicati di [Uso IConfiguration in C# Class Library] (https://stackoverflow.com/questions/27880433/using-iconfiguration-in-c-sharp-class-library) –

+0

È lo stesso problema che [Uso di IConfiguration in C# Class Library] (https://stackoverflow.com/q/27880433/1647238), vedere [risposta] (https://stackoverflow.com/a/47645131/1647238) –

risposta

13

Presumo che si desideri accedere al file appsettings.json dall'applicazione Web poiché le librerie di classi non dispongono di un appsettings.json per impostazione predefinita.

Creo una classe del modello che ha proprietà che corrispondono alle impostazioni in una sezione in appsettings.json.

Sezione in appsettings.json

"ApplicationSettings": { 
    "SmtpHost": "mydomain.smtp.com", 
    "EmailRecipients": "[email protected];[email protected]" 
} 

classe corrispondenza di modello

namespace MyApp.Models 
{ 
    public class AppSettingsModel 
    { 
     public string SmtpHost { get; set; } 
     public string EmailRecipients { get; set; } 
    } 
} 

quindi popolare che classe del modello e aggiungerlo alla collezione IOptions nel contenitore DI (questo è fatto nel metodo Configure() della classe Esecuzione automatica).

services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings")); 

// Other configuration stuff 

services.AddOptions(); 

Quindi è possibile accedere a tale classe da qualsiasi metodo che il quadro chiama aggiungendolo come parametro nel costruttore. Il framework gestisce la ricerca e la fornitura della classe al costruttore.

public class MyController: Controller 
{ 
    private IOptions<AppSettingsModel> settings; 

    public MyController(IOptions<AppSettingsModel> settings) 
    { 
     this.settings = settings; 
    } 
} 

Poi, quando un metodo in una libreria di classi necessita delle impostazioni, che sia passare le impostazioni singolarmente o passare l'intero oggetto.

+0

Non sono sicuro se qualcosa è cambiato da quando questo è stato accettato come risposta, ma non ha funzionato per me quando ho iniziato un nuovo progetto due giorni fa. Le modifiche apportate per farlo funzionare erano: Invece delle impostazioni IOptions , ho dovuto cambiarlo con le impostazioni di AppSettingsModel; Quindi nel costruttore di controller, ho modificato questa riga this.settings = settings; a this.settings = settings.Value; Quindi ha iniziato a funzionare. – Syed

+0

La risposta di cui sopra ha dimenticato la seguente riga di codice all'avvio dopo la chiamata services.Configure <>(): 'services.AddOptions();' –

+0

@StephenPorter Sentirsi a proprio agio ad aggiungere la linea nella sua risposta. – gtzinos

20

So che una risposta è già stata accettata, ma questa domanda è la migliore per Google e la domanda OP riguarda le librerie di classi e non un'app Web ASP.NET o WebApi, che è ciò che la risposta accettata utilizza.

IMO, le librerie di classi non devono utilizzare le impostazioni dell'applicazione e dovrebbero essere agnostiche a tali impostazioni. Se sono necessarie le impostazioni dell'applicazione nella libreria di classi, è necessario fornire tali impostazioni al proprio consumatore. Si può vedere un esempio di questo On This SO Question

+3

Sono parzialmente d'accordo; per ** progetti di test ** che sono impostati come librerie di classi in una soluzione core dotnet, è perfettamente accettabile utilizzare o incorporare le impostazioni dell'app. In questo caso, il progetto di test, ad es. ovviamente la biblioteca di classe è il consumatore. –

+0

@Moriarty True, ma in alcuni casi è possibile che siano presenti più ambienti in cui è possibile eseguire la suite di test. In questo caso, le impostazioni incorporate non funzionerebbero (ad esempio, è necessario test di integrazione per conoscere l'ambiente in cui comunicare con un'API). Non penso sia sempre vero in un modo o nell'altro ed è sempre caso per caso. –

+0

Ovviamente le librerie di classi devono utilizzare la stringa di connessione che punta a un'istanza di db locale. Mentre quell'impostazione viene sovrascritta dal sistema di elementi della configurazione per utilizzare un'altra istanza. IMHO Questa risposta non ha ancora una soluzione. Non è su asp.net core di .NET CORE che legge le app! – Pascal

Problemi correlati