Come usare il modello di opzioni in ASP.NET Core

Quando si lavora in ASP.NET Core, è spesso necessario specificare le impostazioni dell'applicazione, archiviarle in un file e quindi recuperare queste impostazioni quando l'applicazione le richiede. In genere, registreresti le tue dipendenze nel metodo ConfigureServices della classe Startup. Puoi specificare le impostazioni dell'applicazione nel file appsettings.json o in un altro file .json e quindi sfruttare l'inserimento delle dipendenze tramite IOptions per leggere queste impostazioni nell'applicazione.

I modelli di opzioni forniscono un modo elegante per aggiungere impostazioni fortemente tipizzate all'applicazione ASP.NET Core. Il modello di opzioni, che è un'estensione in cima all'interfaccia IServiceCollection, sfrutta le classi per rappresentare un gruppo di impostazioni correlate. Questo articolo parla del modello di opzioni, del motivo per cui è utile e di come può essere usato per lavorare con i dati di configurazione in ASP.NET Core.

Per lavorare con gli esempi di codice forniti in questo articolo, dovresti avere Visual Studio 2019 installato nel tuo sistema. Se non hai già una copia, puoi scaricare Visual Studio 2019 qui.

Crea un progetto API ASP.NET Core

Prima di tutto, creiamo un progetto ASP.NET Core in Visual Studio. Supponendo che Visual Studio 2019 sia installato nel sistema, seguire i passaggi descritti di seguito per creare un nuovo progetto API ASP.NET Core in Visual Studio.

  1. Avvia l'IDE di Visual Studio.
  2. Fai clic su "Crea nuovo progetto".
  3. Nella finestra "Crea nuovo progetto", seleziona "Applicazione Web ASP.NET Core" dall'elenco dei modelli visualizzati.
  4. Fare clic su Avanti.
  5. Nella finestra "Configura il tuo nuovo progetto" mostrata di seguito, specifica il nome e la posizione per il nuovo progetto.
  6. Fare clic su Crea.
  7. Nella finestra "Crea nuova applicazione Web ASP.NET Core", seleziona .NET Core come runtime e ASP.NET Core 3.0 (o successivo) dall'elenco a discesa in alto. Userò ASP.NET Core 3.1 qui.
  8. Seleziona "API" come modello di progetto per creare una nuova applicazione API ASP.NET Core. 
  9. Assicurati che le caselle di controllo "Abilita supporto Docker" e "Configura per HTTPS" siano deselezionate poiché non utilizzeremo queste funzionalità qui.
  10. Assicurati che l'autenticazione sia impostata su "Nessuna autenticazione" poiché non utilizzeremo nemmeno l'autenticazione.
  11. Fare clic su Crea.

Questo creerà un nuovo progetto API ASP.NET Core in Visual Studio. Selezionare la cartella della soluzione Controller nella finestra Esplora soluzioni e fare clic su "Aggiungi -> Controller ..." per creare un nuovo controller denominato DefaultController. Useremo questo progetto nelle sezioni successive di questo articolo.

Implementare il modello di opzioni in ASP.NET Core

Per usare il modello di opzioni in ASP.NET Core, è necessario il pacchetto Microsoft.Extensions.Options.ConfigurationExtensions. Per inciso, le applicazioni ASP.NET Core fanno riferimento implicitamente al pacchetto Microsoft.Extensions.Options.ConfigurationExtensions per impostazione predefinita.

Quando si utilizza il modello di opzioni, in genere si desidera utilizzare le classi per rappresentare un gruppo di impostazioni correlate. Nell'isolare le impostazioni di configurazione in classi separate, l'applicazione aderisce ai seguenti principi:

  • Separazione delle preoccupazioni: le impostazioni utilizzate nei diversi moduli dell'applicazione sono disaccoppiate l'una dall'altra. 
  • Principio di separazione dell'interfaccia: le classi che rappresentano queste impostazioni dipendono solo dalle impostazioni di configurazione che utilizzerebbero. 

Ora scrivi le seguenti impostazioni nel file appsettings.json.

"DatabaseSettings": {

    "Server": "localhost",

    "Provider": "SQL Server",

    "Database": "DemoDb",

    "Porta": 23,

    "UserName": "sa",

    "Password": "Joydip123"

  }

Nota che la tua classe di configurazione dovrebbe avere proprietà get e set pubbliche. Approfitteremo della seguente lezione per leggere queste impostazioni a breve.

 Classe pubblica DatabaseSettings

    {

        stringa pubblica Server {get; impostato; }

        provider di stringhe pubbliche {get; impostato; }

        database di stringhe pubbliche {get; impostato; }

        public int Porta {get; impostato; }

        stringa pubblica UserName {get; impostato; }

        stringa pubblica Password {get; impostato; }

    }

È ora possibile utilizzare il metodo di estensione Configura di IServiceCollection per associare la classe di impostazioni alla configurazione, come mostrato nello snippet di codice riportato di seguito.

public void ConfigureServices (servizi IServiceCollection)

{

   services.AddControllers ();

   services.Configure

   (opzioni => Configuration.GetSection ("DatabaseSettings"). Bind (opzioni));

}

Leggere i dati di configurazione nel controller in ASP.NET Core

Ora sfrutteremo il DefaultController che abbiamo creato in precedenza per dimostrare come leggere i dati di configurazione nel controller. L'interfaccia IOptions espone una proprietà Value che può essere utilizzata per recuperare l'istanza della classe settings.

Il frammento di codice seguente mostra come utilizzare la classe DatabaseSettings nel controller denominato DefaultController. Notare come l'inserimento delle dipendenze (iniezione del costruttore in questo esempio) è stato utilizzato qui.

public class DefaultController: ControllerBase

{

   private DatabaseSettings _settings;

   public DefaultController (impostazioni IOptions)

   {

      _settings = settings.Value;

   }

   // Metodi di azione

}

Applica le regole per le configurazioni in ASP.NET Core

Puoi anche applicare determinate regole come mostrato nello snippet di codice di seguito. Nota come un'istanza della classe helper per SQL Server o MySQL viene aggiunta qui come singleton.

services.Configure (opzioni =>

 {

     if (options.Provider.ToLower (). Trim (). Equals ("sqlserver"))

     {

        services.AddSingleton (new SqlDbHelper ());

     }

     altrimenti if (options.Provider.ToLower (). Trim (). Equals ("mysql"))

     {

         services.AddSingleton (new MySqlDbHelper ());

     }

 });

Il supporto per la configurazione fortemente tipizzata è un'ottima funzionalità in ASP.NET Core che consente di applicare la separazione dei problemi e i principi di separazione dell'interfaccia. In un prossimo post qui sul pattern delle opzioni, parlerò della convalida della configurazione e della configurazione ricaricabile con un focus speciale sull'interfaccia IOptionsMonitor. Fino ad allora, puoi leggere ulteriori informazioni sul modello di opzioni nella documentazione in linea di Microsoft qui. 

Come fare di più in ASP.NET e ASP.NET Core:

  • Come usare la memorizzazione nella cache in memoria in ASP.NET Core
  • Come gestire gli errori nell'API Web ASP.NET
  • Come passare più parametri ai metodi del controller dell'API Web
  • Come registrare i metadati di richieste e risposte nell'API Web ASP.NET
  • Come lavorare con HttpModules in ASP.NET
  • Controllo delle versioni avanzato nell'API Web ASP.NET Core
  • Come usare l'inserimento delle dipendenze in ASP.NET Core
  • Come lavorare con le sessioni in ASP.NET
  • Come lavorare con HTTPHandlers in ASP.NET
  • Come utilizzare IHostedService in ASP.NET Core
  • Come utilizzare un servizio SOAP WCF in ASP.NET Core
  • Come migliorare le prestazioni delle applicazioni ASP.NET Core
  • Come utilizzare un'API Web ASP.NET Core usando RestSharp
  • Come lavorare con la registrazione in ASP.NET Core
  • Come usare MediatR in ASP.NET Core
  • Come lavorare con lo stato della sessione in ASP.NET Core
  • Come utilizzare Nancy in ASP.NET Core
  • Comprendere l'associazione di parametri nell'API Web ASP.NET
  • Come caricare file in ASP.NET Core MVC
  • Come implementare la gestione delle eccezioni globale nell'API Web ASP.NET Core
  • Come implementare i controlli di integrità in ASP.NET Core
  • Procedure consigliate per la memorizzazione nella cache in ASP.NET
  • Come utilizzare la messaggistica Apache Kafka in .NET
  • Come abilitare CORS sulla tua API Web
  • Quando utilizzare WebClient vs. HttpClient vs. HttpWebRequest
  • Come lavorare con Redis Cache in .NET
  • Quando utilizzare Task.WaitAll rispetto a Task.WhenAll in .NET