Laden...

DP Injection 'AddSingleton()' Überladung mit implementationFactory

Erstellt von CoderboyPB vor 3 Jahren Letzter Beitrag vor 3 Jahren 507 Views
C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 3 Jahren
DP Injection 'AddSingleton()' Überladung mit implementationFactory

Hallo, es geht um folgende Überladung:


public static Microsoft.Extensions.DependencyInjection.IServiceCollection AddSingleton<TService> (this Microsoft.Extensions.DependencyInjection.IServiceCollection services, Func<IServiceProvider,TService> implementationFactory) where TService : class;

https://docs.microsoft.com/de-de/dotnet/api/microsoft.extensions.dependencyinjection.servicecollectionserviceextensions.addsingleton?view=dotnet-plat-ext-5.0#Microsoft_Extensions_DependencyInjection_ServiceCollectionServiceExtensions_AddSingleton__1_Microsoft_Extensions_DependencyInjection_IServiceCollection_System_Func_System_IServiceProvider___0__

Wie muss ich diese implementationFactory verstehen?
Sucht die Funktion in der implementationFactory nach einer 'Create()' Methode, oder wie arbeitet die?

16.807 Beiträge seit 2008
vor 3 Jahren

Die Methode registriert nur Services. Nach einer Methode wird nirgends im DI Container gesucht.
Was ist denn die Frage?

D
261 Beiträge seit 2015
vor 3 Jahren

Die implementationFactory muss einfach nur die Instanz für das Singleton zurückgeben. Ob du es selbst via new erstellst oder es schon vor dem Aufruf der Methode existiert, ist egal.

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 3 Jahren

dannoe, hat meine Frage beantwortet, ich war nem kleinen Irrtum aufgesessen, speziell ging es hier um folgende Codezeile:


services.AddSingleton<ISimpleTraderViewModelFactory<LoginViewModel>>
    (serviceProvider =>
        new LoginViewModelFactory
        (
            serviceProvider.GetRequiredService<IAuthenticator>(), 
            new ViewModelFactoryRenavigator<HomeViewModel>
            (
                serviceProvider.GetRequiredService<INavigator>(), 
                serviceProvider.GetRequiredService<ISimpleTraderViewModelFactory<HomeViewModel>>()
            )
        )
    );

Ursprünglich ist sie hier ab Zeile 58 zu finden, ich habe sie aber für die bessere Lesbarkeit entsprechend aufgesplittet und eingerückt:
https://github.com/SingletonSean/SimpleTrader/blob/part-16/SimpleTrader/SimpleTrader.WPF/App.xaml.cs

Wie gesagt, der Umstand, dass hier selber ne Factory aufgelöst wird, hatte mich da auf ne falsche Fährte geschickt.

Kurze Zusammenfassung, was die Zeile macht:

Es ist eine spezielle Auflösung der generischen ViewModelFactory in eine typisierte Factory, welche einen Authenticator bekommt, in welchem der Loggin Status gespeichert ist, sowie einen ViewModelFactoryNavigator, welcher im Navigator Objekt das aktuelle ViewModel setzt.
Hierfür wird der Navigator, sowie eine HomeViewModel Factory übergeben, welche die CurrentViewModel Property des Navigators setzt.

Shit, ich glaube das ist so ziemlich kompliziert, aber in dem Link ist das komplette Repository der Anwendung zum aktuellen Zeitpunkt zu finden.

Mir ging es um das verstehen dieser speziellen Zeile, und wie gesagt, ich war da einem falschen Dampfer aufgesessen, durch den Zufall, dass Serviceklasse selber eine Factory ist.

P
441 Beiträge seit 2014
vor 3 Jahren

Das was du da machst ist unnötig kompliziert.

Deine LoginViewModelFactory scheint ja ISimpleTraderViewModelFactory<LoginViewModel> zu implementieren. Du müsstest also einfach folgendes machen:


services.AddSingleton<ISimpleTraderViewModelFactory<LoginViewModel>, LoginViewModelFactory>();

Zusätzlich musst du noch den Typ ViewModelFactoryRenavigator<HomeViewModel> registrieren.
Dann kannst du dir den komplexen Aufruf sparen.