Ich schreibe meine eigene Erweiterungsmethode für ServiceCollection
, um die Typen meines Moduls zu registrieren, und ich muss auf die IConfiguration
-Instanz von der Sammlung zugreifen, um meine Optionen zu registrieren.
Erweiterungsmethode
%Vor% Ist dies der richtige Weg, um die IConfiguration
-Instanz aus der Sammlung zu holen, oder gibt es eine elegantere Lösung? Ich möchte die IConfiguration-Instanz nicht als Parameter zur Methode hinzufügen.
Nach den Kommentaren habe ich meine Erweiterungsmethode so geändert, dass es Sache des Composers der Anwendung ist, den Konfigurationsbereich für meine Optionen anzugeben.
%Vor%aus der StartUp-Klasse, sieht der Aufruf wie
aus %Vor%Die Entscheidung, es auf diese Weise zu verwenden, geschieht hauptsächlich durch diese Kommentare. Dieser Weg ist vielleicht relevanter, wenn Sie Komponenten entwickeln, die von vielen Entwicklern verwendet werden, als für eine interne Komponente, die Sie in Ihrer Anwendung verwenden.
Imho ist ein schlechtes Design, um von überall auf IConfiguration zuzugreifen innerhalb des Kompositionswurzels (Startup-Klasse für ASP.NET-Core), wie dies Impliziert, dass die Konfigurationsdatei eine bestimmte Struktur haben muss das kann überhaupt nicht geändert werden. Stattdessen würde ich eine Erweiterungsmethode schreiben Konfigurieren Sie die Konfig-Klassen im Composition-Root und übergeben Sie a IConfiguration-Objekt zu, ähnlich wie .Configure (Konfiguration.GetSection ("MyLibConfi g"). Auf diese Weise wird der Entwickler, der seine Anwendung von Ihrem erstellt Komponenten können entscheiden, wo sie innerhalb der appsettings.json platziert werden sollen
Oder wie würdest du Konflikte lösen, wenn zwei Bibliotheken direkt sind referenziere die IConfiguration und habe den gleichen Abschnitt innerhalb der Konfig? d.h. JsonSettings, aber haben eine völlig andere Struktur? Es kann nur gelöst werden, indem man den Entwickler, der es komponiert, wählen lässt und Übergeben Sie den Namen des Abschnitts an Ihre Erweiterungsmethode, die den Optionen über .Configure
Ich habe meinen eigenen "service collection" -Typ erstellt, der die IServiceCollection
und IConfiguration
umhüllt und alle meine Module diesen Typ verwenden, um ihre Dienste zu registrieren. Zum Beispiel:
Dann müssen Sie eine Erweiterungsmethode mit der Konfigurationsinstanz als Parameter erstellen, die die Implementierung für IMyServiceCollection
erstellt, z. B .:
Beachten Sie, dass wir dies in einem modularen Rahmen verwenden. Für einfache Anwendungen ist das Overkill.
Ich denke, dass Ihre Lösung auch in Ordnung ist. Wenn Sie jedoch häufig Zugriff auf die IConfiguration
-Instanz benötigen, können Sie in der Servicesammlung immer wieder mühsam nach ihnen suchen.
Tags und Links c# asp.net-core asp.net-core-2.0 asp.net-core-configuration