Verwendung des Optionsmusters in ASP.NET Core

Wenn Sie in ASP.NET Core arbeiten, geben Sie häufig die Einstellungen Ihrer Anwendung an, speichern sie in einer Datei und rufen diese Einstellungen dann ab, wenn die Anwendung sie benötigt. In der Regel registrieren Sie Ihre Abhängigkeiten in der ConfigureServices-Methode der Startup-Klasse. Sie können die Einstellungen Ihrer Anwendung in der Datei appsettings.json oder einer anderen .json-Datei angeben und dann die Abhängigkeitsinjektion über IOptions nutzen, um diese Einstellungen in Ihrer Anwendung zu lesen.

Die Optionsmuster bieten eine elegante Möglichkeit, Ihrer ASP.NET Core-Anwendung stark typisierte Einstellungen hinzuzufügen. Das Optionsmuster, eine Erweiterung über der IServiceCollection-Oberfläche, nutzt Klassen, um eine Gruppe verwandter Einstellungen darzustellen. Dieser Artikel beschreibt das Optionsmuster, warum es nützlich ist und wie es für die Arbeit mit Konfigurationsdaten in ASP.NET Core verwendet werden kann.

Um mit den in diesem Artikel bereitgestellten Codebeispielen arbeiten zu können, muss Visual Studio 2019 auf Ihrem System installiert sein. Wenn Sie noch keine Kopie haben, können Sie Visual Studio 2019 hier herunterladen.

Erstellen Sie ein ASP.NET Core API-Projekt

Zunächst erstellen wir ein ASP.NET Core-Projekt in Visual Studio. Angenommen, Visual Studio 2019 ist auf Ihrem System installiert, führen Sie die folgenden Schritte aus, um ein neues ASP.NET Core API-Projekt in Visual Studio zu erstellen.

  1. Starten Sie die Visual Studio-IDE.
  2. Klicken Sie auf "Neues Projekt erstellen".
  3. Wählen Sie im Fenster "Neues Projekt erstellen" aus der Liste der angezeigten Vorlagen "ASP.NET Core-Webanwendung" aus.
  4. Weiter klicken.
  5. Geben Sie im nächsten Fenster "Konfigurieren Sie Ihr neues Projekt" den Namen und den Speicherort für das neue Projekt an.
  6. Klicken Sie auf Erstellen.
  7. Wählen Sie im Fenster "Neue ASP.NET Core-Webanwendung erstellen" .NET Core als Laufzeit und ASP.NET Core 3.0 (oder höher) aus der Dropdown-Liste oben aus. Ich werde hier ASP.NET Core 3.1 verwenden.
  8. Wählen Sie "API" als Projektvorlage aus, um eine neue ASP.NET Core API-Anwendung zu erstellen. 
  9. Stellen Sie sicher, dass die Kontrollkästchen "Docker-Unterstützung aktivieren" und "Für HTTPS konfigurieren" deaktiviert sind, da diese Funktionen hier nicht verwendet werden.
  10. Stellen Sie sicher, dass die Authentifizierung auf "Keine Authentifizierung" eingestellt ist, da wir auch keine Authentifizierung verwenden.
  11. Klicken Sie auf Erstellen.

Dadurch wird ein neues ASP.NET Core API-Projekt in Visual Studio erstellt. Wählen Sie im Projektmappen-Explorer den Lösungsordner "Controller" aus und klicken Sie auf "Hinzufügen -> Controller ...", um einen neuen Controller mit dem Namen "DefaultController" zu erstellen. Wir werden dieses Projekt in den folgenden Abschnitten dieses Artikels verwenden.

Implementieren Sie das Optionsmuster in ASP.NET Core

Um das Optionsmuster in ASP.NET Core verwenden zu können, benötigen Sie das Paket Microsoft.Extensions.Options.ConfigurationExtensions. Im Übrigen verweisen die ASP.NET Core-Anwendungen implizit standardmäßig auf das Microsoft.Extensions.Options.ConfigurationExtensions-Paket.

Wenn Sie das Optionsmuster verwenden, möchten Sie normalerweise Klassen verwenden, um eine Gruppe verwandter Einstellungen darzustellen. Beim Isolieren der Konfigurationseinstellungen in separate Klassen befolgt Ihre Anwendung die folgenden Prinzipien:

  • Trennung von Bedenken: Die in verschiedenen Modulen der Anwendung verwendeten Einstellungen sind voneinander entkoppelt. 
  • Prinzip der Schnittstellentrennung: Die Klassen, die diese Einstellungen darstellen, hängen nur von den Konfigurationseinstellungen ab, die sie verwenden würden. 

Schreiben Sie nun die folgenden Einstellungen in die Datei appsettings.json.

"DatabaseSettings": {

    "Server": "localhost",

    "Provider": "SQL Server",

    "Datenbank": "DemoDb",

    "Port": 23,

    "UserName": "sa",

    "Passwort": "Joydip123"

  }}

Beachten Sie, dass Ihre Konfigurationsklasse über öffentliche Eigenschaften zum Abrufen und Festlegen verfügen sollte. Wir werden die folgende Klasse nutzen, um diese Einstellungen in Kürze zu lesen.

 öffentliche Klasse DatabaseSettings

    {

        öffentlicher String Server {get; einstellen; }}

        öffentlicher String-Anbieter {get; einstellen; }}

        öffentliche Zeichenfolge Datenbank {get; einstellen; }}

        public int Port {get; einstellen; }}

        öffentliche Zeichenfolge UserName {get; einstellen; }}

        öffentlicher String Passwort {get; einstellen; }}

    }}

Sie können jetzt die Configure-Erweiterungsmethode von IServiceCollection verwenden, um Ihre Einstellungsklasse an Ihre Konfiguration zu binden, wie im folgenden Code-Snippet gezeigt.

public void ConfigureServices (IServiceCollection-Dienste)

{

   services.AddControllers ();

   services.Configure

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

}}

Lesen Sie die Konfigurationsdaten im Controller in ASP.NET Core

Wir werden jetzt den zuvor erstellten DefaultController nutzen, um zu demonstrieren, wie wir Konfigurationsdaten im Controller lesen können. Die IOptions-Schnittstelle stellt eine Value-Eigenschaft bereit, mit der die Instanz der Einstellungsklasse abgerufen werden kann.

Das folgende Codefragment zeigt, wie Sie die DatabaseSettings-Klasse in Ihrem Controller mit dem Namen DefaultController verwenden können. Beachten Sie, wie hier die Abhängigkeitsinjektion (in diesem Beispiel die Konstruktorinjektion) verwendet wurde.

öffentliche Klasse DefaultController: ControllerBase

{

   private DatabaseSettings _settings;

   public DefaultController (IOptions-Einstellungen)

   {

      _settings = settings.Value;

   }}

   // Aktionsmethoden

}}

Erzwingen Sie Regeln für Konfigurationen in ASP.NET Core

Sie können auch bestimmte Regeln durchsetzen, wie im folgenden Codeausschnitt gezeigt. Beachten Sie, wie hier eine Instanz der Hilfsklasse für SQL Server oder MySQL als Singleton hinzugefügt wird.

services.Configure (Optionen =>

 {

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

     {

        services.AddSingleton (neuer SqlDbHelper ());

     }}

     sonst wenn (options.Provider.ToLower (). Trim (). Equals ("mysql"))

     {

         services.AddSingleton (neuer MySqlDbHelper ());

     }}

 });

Die Unterstützung für stark typisierte Konfigurationen ist eine großartige Funktion in ASP.NET Core, mit der Sie die Prinzipien der Trennung von Bedenken und Schnittstellentrennung anwenden können. In einem zukünftigen Beitrag hier zum Optionsmuster werde ich über Konfigurationsvalidierung und wiederaufladbare Konfiguration mit einem besonderen Schwerpunkt auf der IOptionsMonitor-Schnittstelle sprechen. Bis dahin können Sie hier mehr über das Optionsmuster in der Online-Dokumentation von Microsoft lesen. 

So machen Sie mehr in ASP.NET und ASP.NET Core:

  • Verwendung des In-Memory-Caching in ASP.NET Core
  • Behandlung von Fehlern in der ASP.NET-Web-API
  • Übergeben mehrerer Parameter an Web-API-Controller-Methoden
  • So protokollieren Sie Anforderungs- und Antwortmetadaten in der ASP.NET-Web-API
  • So arbeiten Sie mit HttpModules in ASP.NET
  • Erweiterte Versionierung in der ASP.NET Core-Web-API
  • Verwendung der Abhängigkeitsinjektion in ASP.NET Core
  • So arbeiten Sie mit Sitzungen in ASP.NET
  • So arbeiten Sie mit HTTPHandlern in ASP.NET
  • Verwendung von IHostedService in ASP.NET Core
  • So verwenden Sie einen WCF-SOAP-Dienst in ASP.NET Core
  • So verbessern Sie die Leistung von ASP.NET Core-Anwendungen
  • So verwenden Sie eine ASP.NET Core-Web-API mit RestSharp
  • So arbeiten Sie mit der Protokollierung in ASP.NET Core
  • Verwendung von MediatR in ASP.NET Core
  • So arbeiten Sie mit dem Sitzungsstatus in ASP.NET Core
  • Verwendung von Nancy in ASP.NET Core
  • Grundlegendes zur Parameterbindung in der ASP.NET-Web-API
  • So laden Sie Dateien in ASP.NET Core MVC hoch
  • Implementieren der globalen Ausnahmebehandlung in der ASP.NET Core-Web-API
  • Implementieren von Integritätsprüfungen in ASP.NET Core
  • Best Practices für das Caching in ASP.NET
  • Verwendung von Apache Kafka Messaging in .NET
  • So aktivieren Sie CORS in Ihrer Web-API
  • Wann wird WebClient vs. HttpClient vs. HttpWebRequest verwendet?
  • So arbeiten Sie mit Redis Cache in .NET
  • Verwendung von Task.WaitAll vs. Task.WhenAll in .NET