Ersetzen Sie die Registrierung im service ASP.NET Core-built-in DI-container?
Betrachten wir eine service-Registrierung in Startup.ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IFoo, FooA>();
}
Ist es möglich, zu ändern IFoo
Registrierung FooB
nach AddTransient
aufgerufen wurde? Es kann hilfreich sein, für Test-Zwecke (zum Beispiel, in TestStartup
Unterklasse) oder, wenn unser Zugang zur Codebasis ist begrenzt.
Wenn wir ein anderes register IFoo
Umsetzung:
services.AddTransient<IFoo, FooA>();
services.AddTransient<IFoo, FooB>();
Dann GetService<IFoo>
zurück FooB
statt FooA
:
IFoo service = services.BuildServiceProvider().GetService<IFoo>();
Assert.True(service is FooB);
Jedoch GetServices<IFoo>
erfolgreich gibt die beiden Implementierungen (und das gleiche für GetService<IEnumerable<IFoo>>
):
var list = services.BuildServiceProvider().GetServices<IFoo>().ToList();
Assert.Equal(2, list.Count);
Es ist Remove(ServiceDescriptor)
Methode in IServiceCollection
Vertrag. Was soll ich mit ServiceDescriptor
zum ändern einer service-Registrierung?
InformationsquelleAutor Ilya Chumakov | 2017-04-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist einfach mit Hilfe der
Replace(IServiceCollection, ServiceDescriptor)
Methode aus derServiceCollectionDescriptorExtensions
Klasse.Siehe auch:
Replace
ruft intern die gleichenAdd
undRemove
Methoden, die ich als. Es ist eine gute Ergänzung trotzdem, vielen Dank.Ein anderer Weg (in weniger Zeilen, aber mit den gleichen Methoden);
services.Replace(ServiceDescriptor.Transient<IFoo, FooB>());
Emdeded links = 404
Sie zog die DI aus ASP.NET Kern in eine separate Bibliothek. Ich fixe die links.
wie würden Sie sich registrieren verspottet logger-Instanz? oder vielleicht überprüfen, fordert die nulllogger?
InformationsquelleAutor Dustin Kingen
Ist es einfach zu überschreiben ASP.NET Kern DI-Funktionalität, wenn Sie wissen, dass zwei einfache Dinge:
1.
ServiceCollection
ist nur ein wrapper auf der Oberseite desList<ServiceDescriptor>
:2. Wenn ein Dienst registriert ist, eine neue Deskriptor ist in der Liste zu finden:
Daher ist es möglich, hinzufügen/entfernen von Deskriptoren zu/aus dieser Liste zu ersetzen, die der Anmeldung:
Beenden wir mit
Replace<TService, TImplementation>
extention Methode:Seine Umsetzung:
InformationsquelleAutor Ilya Chumakov