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;
Wie muss ich diese implementationFactory verstehen?
Sucht die Funktion in der implementationFactory nach einer 'Create()' Methode, oder wie arbeitet die?
Die Methode registriert nur Services. Nach einer Methode wird nirgends im DI Container gesucht.
Was ist denn die Frage?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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.
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.