2017-03-28 4 views
1

In den alten TagenZugang .NET Core-Konfiguration Klasse von einer anderen Assembly

In einer web.config-Datei könnten Einstellungen wie so in einem Abschnitt appSettings platziert werden:

<appSettings> 
    <add key="mysetting" value="123"/> 
</appSettings> 

Auch wenn mein web.config-Datei war in meinem Web-Projekt, werden alle Baugruppen/Bibliotheken in diesem Projekt verwendet werden, könnten die Einstellungen zugreifen verwenden:

ConfigurationManager.AppSettings["mysetting"] 

Heute (und das Problem)

Ich fange an, .NET-Kern zu verwenden, und genau wie zuvor habe ich Assemblys/Bibliotheken, die keine Webprojekte in sich selbst sind und auf verschiedene Konfigurationseinstellungen zugreifen müssen.

Die Microsoft-Konfigurationsdokumentation (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration) zusammen mit allen anderen Beispielen, die ich finden kann, die Konfigurationsklasse wird von einem Controller verbraucht und gibt keine Anleitung, wie es mit einer Klasse in einer anderen Assembly funktioniert/Bibliothek, die kein Controller ist.

Für ein Beispiel, wenn ich ein benutzerdefiniertes Attribut habe, mit dem ich eine Klasse dekorieren kann und das benutzerdefinierte Attribut in einer anderen Bibliothek (nicht in einem Webprojekt) definiert ist und auf eine Konfigurationseinstellung zugreifen muss, wie gehe ich vor das heute? Ich kann auch in einem solchen Fall nichts an einen Konstruktor weitergeben.

+0

Ich folge nur, wie ich genau das gleiche brauche. –

Antwort

0

Ich gehe davon aus, dass Sie über ein ASPNET Core-Projekt sprechen, wie Sie speziell web.config erwähnen.

Hier ist, was Sie tun müssen.

IOptions<FooSettingsClass> wird normalerweise beim Start der Anwendung konfiguriert, was bedeutet, dass es zur Laufzeit mit Code verfügbar ist, der ungefähr so ​​aussieht.

// Adds services required for using options. 
services.AddOptions(); 
services.Configure<AppSettings>(Configuration.GetSection("FooAppSettings")); 

Der einfachste Weg ist es, das Framework durch den Konstruktor injizieren zu lassen. Typischerweise werden Sie es sehen (wie Sie bereits erwähnt) in der Steuerung wie folgt injiziert wird:

class FooController : Controller { 
    public FooController(IOptions<FooSettingsClass> settings) { . 
    //.. 
    } 
} 

Wenn Sie diese Konfiguration zugreifen müssen, ist, sagen, ein Dienst, dann haben Sie einfach einen Konstruktor, in einem anderen Assembly, die diese Optionen akzeptiert. Also:

public class SomeServiceInAnotherAssembly { 
    public SomeServiceInAnotherAssembly(IOptions<FooSettingsClass> settings) { 
    //.. 
    } 
} 

Das ist offensichtlich bedeutet, dass Ihre FooSettingsClass Klasse außerhalb Ihres ASPNET Core-Projektes sein muss (um zirkuläre Abhängigkeiten zu vermeiden), aber dies ist ein Weg, um Ihre Konfiguration zu propagieren, ohne Code zu schreiben, das ist, was ich Habe andere Entwickler gesehen. Code zu schreiben ist für mich eine Hoop-Jumping-Lösung, die mit Fehlern behaftet ist.

Vergessen Sie nicht, dass Ihre Klasse (in diesem exampe SomeServiceInAnotherAssembly) beim Start registriert werden muss, das heißt services.AddScoped<SomeServiceInAnotherAssembly>();

Das Schöne an diesem Ansatz ist, dass es Ihre Klassen prüfbar macht.

Verwandte Themen