Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
DP Injection 'AddSingleton()' Überladung mit implementationFactory
CoderboyPB
myCSharp.de - Member



Dabei seit:
Beiträge: 286
Herkunft: Paderborn

Themenstarter:

DP Injection 'AddSingleton()' Überladung mit implementationFactory

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15510
Herkunft: BW

beantworten | zitieren | melden

Die Methode registriert nur Services. Nach einer Methode wird nirgends im DI Container gesucht.
Was ist denn die Frage?
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 141

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
CoderboyPB
myCSharp.de - Member



Dabei seit:
Beiträge: 286
Herkunft: Paderborn

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 344
Herkunft: Kassel

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers