Ist es möglich, eine Instanz von IOptions<AppSettings>
aus der ConfigureServices
Methode in Startup aufzulösen ? Normalerweise können Sie IServiceProvider
Instanzen initialisieren, aber Sie haben sie zu diesem Zeitpunkt noch nicht, wenn Sie Dienste registrieren.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(
configuration.GetConfigurationSection(nameof(AppSettings)));
// How can I resolve IOptions<AppSettings> here?
}
c#
asp.net-core
inversion-of-control
asp.net-core-mvc
Muhammad Rehan Saeed
quelle
quelle
ConfigureServices
Methode.BuildServiceProvider
verursacht die Verwendung eine Warnung, wenn sie im Anwendungscode verwendet wird, z. B.ConfigureServices
weil dadurch eine zusätzliche Kopie der Singleton-Dienste erstellt wird erstellt. Die Antwort von Ehsan Mirsaeedi hier ist die idealste Lösung für solche Fälle.Der beste Weg, um Klassen zu instanziieren, die von anderen Diensten abhängig sind, ist die Verwendung der Überladung Add XXX , mit der Sie den IServiceProvider erhalten . Auf diese Weise müssen Sie keinen Zwischendienstanbieter instanziieren.
Die folgenden Beispiele zeigen, wie Sie diese Überladung in AddSingleton / AddTransient- Methoden verwenden können.
quelle
Der einfachste und korrekteste Weg, dies in allen Versionen von ASP.NET Core zu erreichen , ist die Implementierung der
IConfigureOptions<TOptions>
Schnittstelle. Obwohl dies seit .NET Core 1.0 der Fall ist, scheinen nur wenige Menschen zu wissen, wie es die Dinge zu Just Work ™ macht.Als Beispiel möchten Sie einen benutzerdefinierten Modellvalidator hinzufügen, der von einem der anderen Dienste Ihrer Anwendung abhängig ist. Zunächst scheint es unmöglich - es gibt keine Möglichkeit zur Lösung,
IMyServiceDependency
da Sie keinen Zugriff auf Folgendes habenIServiceProvider
:Aber die "Magie" von
IConfigureOptions<TOptions>
macht es so einfach:Im Wesentlichen wird jedes Setup, das Sie in den
Add***(***Options)
Delegaten in vorgenommen haben,ConfigureServices
jetzt inIConfigureOptions<TOptions>
dieConfigure
Methode Ihrer Klasse verschoben . Dann registrieren Sie die Optionen auf die gleiche Weise, wie Sie jeden anderen Dienst registrieren würden, und los geht's!Für weitere Details sowie Informationen darüber, wie dies hinter den Kulissen funktioniert, verweise ich Sie auf den immer ausgezeichneten Andrew Locke .
quelle
Suchen Sie etwas wie folgendes? Sie können sich meine Kommentare im Code ansehen:
quelle
Möchten Sie anderen helfen, die gleich aussehen, aber auch Autofac verwenden?
Wenn Sie ILifetimeScope (dh einen Container mit aktuellem Gültigkeitsbereich) abrufen möchten, müssen Sie die
app.ApplicationServices.GetAutofacRoot()
Methode aufrufen ,Configure(IApplicationBuilder app)
um die ILifetimeScope-Instanz zurückzugeben, mit der Sie Dienste auflösen könnenquelle