Während der Bootstrapping ConfigureServices()
meiner Anwendung registriere ich hauptsächlich Transienten und Bereichstypen mit der Dependency-Injection-Framework, das .Net Core. Allerdings habe ich einen Typ, der als Singleton registriert ist, ist meine InProcessBus
(ich benutze eine CQRS-Architektur).IServiceProvider.GetSingleton Auflösung Null in Asp.Net Core DI
services.AddSingleton<InProcessBus>(new InProcessBus());
...
services.AddSingleton<ICommandSender>(y => y.GetService<InProcessBus>());
services.AddSingleton<IEventPublisher>(y => y.GetService<InProcessBus>());
Wie man sehen kann ich Implementierung Werksfunktionen für die tatsächlichen Typen verwenden, die in der Steuerung der APIs verwendet werden. Die wirklich bizarre Sache ist, wenn der Controller lädt und die Laufzeit versucht,.zu konstruieren injizieren es schlägt fehl und meldet einen Fehler.
Wenn ich die serviceCollection
inspizieren kann ich sehen, dass die implementationFactory richtig gegen die Art unter dem ImplementationInstance
Eigentum registriert ist.
Die tiefere und direkte Auflösung des Typs am Ende der Startup
Klasse ConfigureServices()
Methode bestätigt, dass der Container null
löst.
Warum wird eine ImplementationFactory-Methode für einen eindeutig im Container vorhandenen Singleton zur Laufzeit nicht aufgelöst?
Das ist seltsam. Sie sollten jedoch vermeiden, 'y.GetService()' zu verwenden und 'y.GetRequiredService ()' zu verwenden, das eine Ausnahme auslöst, wenn sie nicht aufgelöst werden kann, anstatt null zurückzugeben. Obwohl das wahrscheinlich Ihr Problem nicht lösen wird. Gibt es mehr dazu? Sie können es auch nicht in 'ConfigureServices' auflösen. Zu diesem Zeitpunkt ist der Container noch nicht gebaut. Earlierst Punkt, den Sie Dienste auflösen können, ist in 'Configure' Methode (wenn Sie die Standard-Startup.cs verwenden, die mit den Vorlagen geliefert wird) –
Tseng
Sind Sie sicher, dass Sie den integrierten Container verwenden möchten? CQRS-Architekturstile sind wirklich leistungsfähig, da sie es sehr einfach machen, übergreifende Probleme mit Dekoratoren zu lösen. Es ist nicht möglich, generische Dekoratoren mit dem integrierten Container zu verwenden. – Steven
@Tseng, danke für den Tipp GetRequiredService, eine explizite Ausnahme ist besser als Null. Gewöhnlich wäre nicht in der Lage, ja zu lösen, aber ich BuildServiceProvider() verwendet, um meinen eigenen Anbieter mit inline zu testen, wenn ich das Problem hatte ... –