Dependency Injection - Grundlagen

  • C#
  • .NET 5–6

    Dependency Injection - Grundlagen

    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

    C#-Quellcode

    1. public static class DependencyProvider
    2. {
    3. private static ServiceCollection _collection = new();
    4. public static ServiceCollection ServicesCollection => _collection;
    5. public static ServiceProvider? Services { get; set; }
    6. public static IServiceCollection AddSingleton<T>() where T : class => ServicesCollection.AddSingleton<T>();
    7. public static T? GetService<T>() where T : class => Services?.GetService<T>();
    8. public static void BuildServiceProvider()
    9. {
    10. Services = ServicesCollection.BuildServiceProvider();
    11. }


    und im AppBuilder steht dann ein ConfigureServices:

    Spoiler anzeigen

    C#-Quellcode

    1. private static void ConfigureServices()
    2. {
    3. DependencyProvider.AddSingleton<LoggerService>()
    4. .AddSingleton<ErrorHandler>()
    5. .AddSingleton<SettingsService>()
    6. .AddSingleton(new BankDBController(""))
    7. ;
    8. DependencyProvider.BuildServiceProvider();
    9. DependencyProvider.GetService<ErrorHandler>()!.SetLoggerService(DependencyProvider.GetService<LoggerService>()!);
    10. DependencyProvider.GetService<SettingsService>()!.SetLoggerService(DependencyProvider.GetService<LoggerService>()!);
    11. }


    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