Ich habe durchgemacht Konfigurationsdokumentation zum ASP.NET-Kern . Die Dokumentation besagt, dass Sie von überall in der Anwendung auf die Konfiguration zugreifen können.
Unten ist Startup.cs von Vorlage erstellt
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsEnvironment("Development"))
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
}
}
Also rein Startup.cs
Konfiguration aller Einstellungen hat Startup.cs auch eine Eigenschaft mit dem NamenConfiguration
Was kann ich nicht verstehen, wie Sie auf diese Konfiguration im Controller oder irgendwo in der Anwendung zugreifen? MS empfiehlt die Verwendung eines Optionsmusters, aber ich habe nur 4-5 Schlüssel-Wert-Paare, daher möchte ich kein Optionsmuster verwenden. Ich wollte nur Zugriff auf die Konfiguration in der Anwendung haben. Wie spritze ich es in einer Klasse?
Antworten:
Aktualisieren
Bei Verwendung von ASP.NET Core 2.0 wird die Instanz Ihrer Anwendung automatisch
IConfiguration
zum Abhängigkeitsinjektionscontainer hinzugefügt . Dies funktioniert auch in Verbindung mitConfigureAppConfiguration
demWebHostBuilder
.Beispielsweise:
Es ist genauso einfach wie das Hinzufügen der
IConfiguration
Instanz zur Service-Sammlung als Singleton-Objekt inConfigureServices
:Wo
Configuration
ist die Instanz in IhrerStartup
Klasse?Auf diese Weise können Sie
IConfiguration
jeden Controller oder Service einspeisen :quelle
IConfiguration
ist sehr undicht. Es ist weitaus besser, das Optionsmuster zu verwenden .In .NET Core können Sie das
IConfiguration
als Parameter in Ihren Klassenkonstruktor einfügen, und es wird verfügbar sein.Wenn Sie jetzt eine Instanz Ihrer Klasse erstellen möchten
IConfiguration
, können Sie dies nicht einfach tun , da Ihre Klasse injiziert wirdnew MyClass()
, da einIConfiguration
Parameter in den Konstruktor eingefügt werden muss. Daher müssen Sie Ihre Klasse als injizieren gut zur Injektionskette, was zwei einfache Schritte bedeutet:1) Fügen Sie Ihre Klasse (n) hinzu - wo Sie die verwenden möchten
IConfiguration
, zuIServiceCollection
derConfigureServices()
Methode inStartup.cs
2) Definieren Sie eine Instanz - sagen wir in der
Controller
und injizieren Sie sie mit dem Konstruktor:Jetzt sollten Sie in der Lage sein, Ihre
_myClass.configuration
freien ...Wenn Sie immer noch nach einer Möglichkeit suchen, es verfügbar zu machen, ohne die Klassen in den Controller einfügen zu müssen, können Sie es in einer Datei speichern
static class
, die Sie in der folgenden Konfiguration konfigurierenStartup.cs
:Und Ihr
Startup
Konstruktor sollte so aussehen:Verwenden Sie dann eine
MyAppData.Configuration
beliebige Stelle in Ihrem Programm.Konfrontieren Sie mich nicht, warum die erste Option der richtige ist. Ich kann nur sehen, dass erfahrene Entwickler auf ihrem Weg immer Mülldaten vermeiden, und es ist klar, dass es nicht die beste Vorgehensweise ist, ständig viele Daten im Speicher verfügbar zu haben. Weder ist es gut für die Leistung noch für die Entwicklung, und vielleicht ist es auch sicherer, nur das bei sich zu haben, was Sie brauchen.
quelle
System.Configuration
für CORE wieder auf Kurs gekommen. Jetzt können Sie wie in guten alten Zeiten auf Ihre guten alten app.configs zugreifen. Und ich spreche hier nicht von Controllern. Wir sprechen von Komponenten, die ihre eigenen Konfigurationen habenIch weiß, dass dies alt ist, aber angesichts der IOptions-Muster ist es relativ einfach zu implementieren:
Klasse mit öffentlichen Eigenschaften zum Abrufen / Festlegen, die den Einstellungen in der Konfiguration entsprechen
Registrieren Sie Ihre Einstellungen
über IOptions injizieren
Ich bin mir nicht sicher, warum Sie das nicht einfach tun würden.
quelle
Microsoft.Extensions.Configuration
,Microsoft.Extensions.Configuration.Binder
undMicrosoft.Extensions.Configuration.Json
dann laden Sie eineappsettings.json
Datei wie .. und Sie müssen auch sicherstellenvar config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
, dass dieappsettings.json
Kopie in das Ausgabeverzeichnis aufcopy always
Es gibt auch eine Option, um
configuration
in startup.cs statisch zu machen, so dass statische Variablen praktisch sind, was Sie überall problemlos darauf zugreifen können.Dies macht die Konfiguration überall zugänglich.
Startup.Configuration.GetSection...
Was kann schief gehen?quelle
Ich mache es im Moment so:
Und dann verwende ich dies, wo ich die Daten aus der Datei appsettings.json abrufen muss:
quelle
Ich habe mir das Mustermuster für Optionen angesehen und Folgendes gesehen:
Beim Hinzufügen von Iconfiguration im Konstruktor meiner Klasse konnte ich über DI auf die Konfigurationsoptionen zugreifen.
Beispiel:
quelle
Ich weiß, dass es mehrere Möglichkeiten gibt, dies zu tun. Ich verwende Core 3.1 und habe nach der optimalen / saubereren Option gesucht. Am Ende habe ich Folgendes getan:
quelle
In den Jahren 8-2017 brachte Microsoft
System.Configuration
.NET CORE v4.4 heraus. Derzeit Vorschau auf v4.5 und v4.6.Für diejenigen von uns, die an der Transformation von .Net Framework zu CORE arbeiten, ist dies von wesentlicher Bedeutung. Es ermöglicht das
app.config
Speichern und Verwenden aktueller Dateien, auf die von jeder Baugruppe aus zugegriffen werden kann. Es kann wahrscheinlich sogar eine Alternative dazu seinappsettings.json
, da Microsoft die Notwendigkeit dafür erkannt hat. Es funktioniert genauso wie zuvor in FW. Es gibt einen Unterschied:In den Web - Anwendungen, [zB ASP.NET CORE WEB - API] Sie verwenden müssen
app.config
und nicht web.config für IhreappSettings
oderconfigurationSection
. Möglicherweise müssen Sie diese verwenden,web.config
jedoch nur, wenn Sie Ihre Site über IIS bereitstellen. Sie platzieren IIS-spezifische Einstellungen inweb.config
Ich habe es mit netstandard20 DLL und Asp.net Core Web Api getestet und es funktioniert alles.
quelle
Die Verwendung des Optionsmusters in ASP.NET Core ist der richtige Weg. Ich möchte nur hinzufügen, wenn Sie auf die Optionen in Ihrer startup.cs zugreifen müssen , empfehle ich, dies folgendermaßen zu tun:
CosmosDbOptions.cs:
Startup.cs:
quelle
Ich muss beim Start eigene Parameter lesen.
Das muss vorhanden sein, bevor der WebHost gestartet wird (da ich die URL / IP und den Port zum Abhören aus der Parameterdatei und zum Anwenden auf den WebHost benötige). Außerdem brauche ich die Einstellungen öffentlich in der gesamten Anwendung.
Nach einer Weile der Suche (kein vollständiges Beispiel gefunden, nur Schnipsel) und nach verschiedenen Versuchen und Fehlern habe ich mich entschlossen, es auf die "alte Art" mit einer eigenen INI-Datei zu machen.
Also ... wenn Sie Ihre verwenden möchten eigene INI-Datei und / oder setzen Sie die "zu hören URL / IP" Ihre eigene und / oder benötigen Sie die Einstellungen öffentlich, dies ist für Sie ...
Vollständiges Beispiel, gültig für Core 2.1 (mvc):
Erstellen Sie eine INI-Datei - Beispiel:
wobei die Dummyx nur als Beispiel für andere Datumstypen als Zeichenfolge enthalten sind (und auch um den Fall "falscher Parameter" zu testen (siehe Code unten).
Es wurde eine Codedatei im Stammverzeichnis des Projekts hinzugefügt, um die globalen Variablen zu speichern:
Der Code in program.cs wurde geändert (vor CreateWebHostBuilder ()):
Diesen Weg:
Wenn z. B. ein falscher Typ festgelegt ist (z. B. wird * Dummy1 = gew7623 anstelle von Dummy1 = true aktiviert), wird der Host rot angezeigt Informationen befinden sich auf der Konsole (einschließlich der Ausnahme) und ich kann auch in der Anwendung reagieren (GV.bFehler_Ini wird auf true gesetzt, wenn Fehler mit der INI vorliegen).
quelle