web-dev-qa-db-ger.com

Zugriff von der Klassenbibliothek auf appsetting.json im Asp.net-core

Ich versuche, auf appsetting.json-Datei aus einer Klassenbibliothek zuzugreifen. Die Lösung, die ich gefunden habe, besteht bisher darin, eine Konfigurationsklasse zu erstellen, die das Interface IConfiguration von Microsoft.Extensions.Configuration implementiert, und die Json-Datei zur Klasse hinzufügt und aus derselben liest.

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

Dies scheint eine schlechte Option zu sein, da wir die Json-Datei jedes Mal hinzufügen müssen, wenn wir auf die Konfiguration des Appsets zugreifen müssen. Wir haben keine Alternative wie ConfigurationManager in ASP.NET .

22
Parameswar Rao

Ich gehe davon aus, dass Sie von der Webanwendung auf die appsettings.json-Datei zugreifen möchten, da Klassenbibliotheken standardmäßig keinen appsettings.json haben.

Ich erstelle eine Modellklasse mit Eigenschaften, die den Einstellungen in einem Abschnitt in appsettings.json entsprechen.

Abschnitt in appsettings.json

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

Passende Modellklasse

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

Füllen Sie dann diese Modellklasse aus und fügen Sie sie der Kollektion IOptions im DI-Container hinzu (dies geschieht in der Configure()-Methode der Startup-Klasse).

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

// Other configuration stuff

services.AddOptions();

Sie können dann von jeder Methode, die das Framework aufruft, auf diese Klasse zugreifen, indem Sie sie im Konstruktor als Parameter hinzufügen. Das Framework übernimmt das Finden und Bereitstellen der Klasse für den Konstruktor.

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

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

Wenn dann eine Methode in einer Klassenbibliothek die Einstellungen benötigt, übergebe ich die Einstellungen entweder einzeln oder das gesamte Objekt.

22
Clint B

Ich weiß, dass eine Antwort bereits akzeptiert wurde, aber diese Frage ist ein Top-Treffer bei Google und bei OPs geht es um Klassenbibliotheken und nicht um eine ASP.NET-Webanwendung oder ein WebApi, das die akzeptierte Antwort verwendet.

IMO, Klassenbibliotheken sollten keine Anwendungseinstellungen verwenden und sollten solchen Einstellungen nicht gerecht werden. Wenn Sie in Ihrer Klassenbibliothek Anwendungseinstellungen benötigen, sollten Sie diese Einstellungen von Ihrem Consumer vornehmen. Sie können ein Beispiel für diese On This SO Frage sehen

30
Stephen Porter

Abgesehen davon, dass die Fragen eine akzeptierte Antwort haben, gibt es meines Erachtens niemanden, der sich nur auf eine Klassenbibliothek bezieht, ohne Startprojekte oder Abhängigkeiten mit Asp.NetCore-Stapel oder IServiceCollection zu haben.

So habe ich es geschafft, die Konfiguration aus einer Klassenbibliothek zu lesen:

using Microsoft.Extensions.Configuration;
using System.IO;

public class ConfigSample
{
    public ConfigSample
    {
            IConfigurationBuilder builder = new ConfigurationBuilder();
            builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json"));

            var root = builder.Build();
            var sampleConnectionString = root.GetConnectionString("your-connection-string");
    }
}

Die folgenden Nuget-Pakete sind erforderlich:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.FileProviders.Abstractions
  • Newtonsoft.Json
  • Microsoft.Extensions.Configuration.Json
5

Ich weiß, dass die Frage eine akzeptierte Antwort hat, aber die Frage bezieht sich auf Klassenbibliotheken. Wie man appsettings.json aus einer Klassenbibliothek liest, sieht folgendermaßen aus: 

Erstellen Sie ein Modell mit den Eigenschaften, die denen in Ihrer Einstellungsdatei entsprechen:

public class ConfigurationManager
{
    public string BaseUrl { get; set; }
}

Fügen Sie die tatsächlichen Einstellungen in Ihre appsettings.json hinzu

  "ConfigurationManager": {
    "BaseUrl": "myValue"
  }

Registrieren Sie jetzt den Bereich appsettings.json mit Ihrem Modell in startup.cs:

 services.Configure<ConfigurationManager>(Configuration.GetSection("ConfigurationManager"));

Erstellen Sie in Ihrer Klassenbibliothek eine Klasse, die verwendet wird 

using Microsoft.Extensions.Options;

Und erhalten Sie Ihre Konfigurationseinstellungen:

using Microsoft.Extensions.Options;


public class KeyUrls: IKeyUrls
{
    public string BaseUrl = "";
    private readonly IOptions<ConfigurationManager> _configurationService;

    public KeyUrls(IOptions<ConfigurationManager> configurationservice)
    {
        _configurationService = configurationservice;
        BaseUrl = _configurationService.Value.BaseUrl;
    }

    public  string GetAllKeyTypes()
    {
        return $"{BaseUrl}/something";
    }

    public  string GetFilteredKeys()
    {
        return $"{BaseUrl}/something2";
    }
}

Weitere Einzelheiten finden Sie unter This

5
ThunD3eR

Fügen Sie Reference von System.Configuration in dem Projekt hinzu, in dem Sie die Klasse hinzugefügt haben. Anschließend können Sie alle Schlüssel verwenden. Viel Glück :)

0
sami ullah