Moin,
ich denke, ich habe verstanden, was DI soll und wozu es gut ist. Dennoch finde ich keinen realen Ansatz. Das ganze Geschreibsel ist mir zu abstrakt und mir fehlt da die Vorstellungskraft, aus dem theoretische Gedöns, meine praktische Arbeit zu gestalten.
Ich habe eine (WPF) Anwendung, die mehrere DLLs einbindet. Wie mache ich denn den Serviceprovider den DLLs bekannt? Ich habe mir mal eine statische Klasse gebastelt, habe aber keine Ahnung, ob das der empfohlene Weg ist
Spoiler anzeigen
und im AppBuilder steht dann ein
Spoiler anzeigen
Dabei ist zu beachten, dass der LoggerService auch in die Fehlerbehandlung und die Usersettings injiziert werden muss. Macht man das so? Irgendwo habe ich gelesen, das ginge auch automatisch (Auto-Wiring)?
Ein Problem ist auch, dass der Datenbankservice (BankDBController) einen Parameter, den Connectionstring, benötigt. Die Beispiele im Netz wie man Parameter über DI an Contructors übergibt, bringen mich nicht weiter. Eigentlich würde ich den DatenbankService auch generisch gestaltet und nicht mit new() gleich zu Beginn erzeugen. Es ist nicht gegeben, dass bei jedem Gebrauch der Anwendung die Datenbank auch gebraucht wird.
Es muss doch irgendwo einfache praktische Beispiele geben, wie ich mir abschauen kann.
Gruß
Joachim
ich denke, ich habe verstanden, was DI soll und wozu es gut ist. Dennoch finde ich keinen realen Ansatz. Das ganze Geschreibsel ist mir zu abstrakt und mir fehlt da die Vorstellungskraft, aus dem theoretische Gedöns, meine praktische Arbeit zu gestalten.
Ich habe eine (WPF) Anwendung, die mehrere DLLs einbindet. Wie mache ich denn den Serviceprovider den DLLs bekannt? Ich habe mir mal eine statische Klasse gebastelt, habe aber keine Ahnung, ob das der empfohlene Weg ist
C#-Quellcode
- public static class DependencyProvider
- {
- private static ServiceCollection _collection = new();
- public static ServiceCollection ServicesCollection => _collection;
- public static ServiceProvider? Services { get; set; }
- public static IServiceCollection AddSingleton<T>() where T : class => ServicesCollection.AddSingleton<T>();
- public static T? GetService<T>() where T : class => Services?.GetService<T>();
- public static void BuildServiceProvider()
- {
- Services = ServicesCollection.BuildServiceProvider();
- }
und im AppBuilder steht dann ein
ConfigureServices
:C#-Quellcode
- private static void ConfigureServices()
- {
- DependencyProvider.AddSingleton<LoggerService>()
- .AddSingleton<ErrorHandler>()
- .AddSingleton<SettingsService>()
- .AddSingleton(new BankDBController(""))
- ;
- DependencyProvider.BuildServiceProvider();
- DependencyProvider.GetService<ErrorHandler>()!.SetLoggerService(DependencyProvider.GetService<LoggerService>()!);
- DependencyProvider.GetService<SettingsService>()!.SetLoggerService(DependencyProvider.GetService<LoggerService>()!);
- }
Dabei ist zu beachten, dass der LoggerService auch in die Fehlerbehandlung und die Usersettings injiziert werden muss. Macht man das so? Irgendwo habe ich gelesen, das ginge auch automatisch (Auto-Wiring)?
Ein Problem ist auch, dass der Datenbankservice (BankDBController) einen Parameter, den Connectionstring, benötigt. Die Beispiele im Netz wie man Parameter über DI an Contructors übergibt, bringen mich nicht weiter. Eigentlich würde ich den DatenbankService auch generisch gestaltet und nicht mit new() gleich zu Beginn erzeugen. Es ist nicht gegeben, dass bei jedem Gebrauch der Anwendung die Datenbank auch gebraucht wird.
Es muss doch irgendwo einfache praktische Beispiele geben, wie ich mir abschauen kann.
Gruß
Joachim