Autor Beitrag
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Sa 09.03.13 11:13 
Hallo Zusammen,

folg. Situation:
In einer Anwendung benötige ich einen Dateiloader. Dieser soll vorerst CSV-Dateien laden. Später soll das ganze über Excel (*.xls) laufen. Sprich ich möchte den Loader event. mittels DI austauschbar gestalten.

Die Injection kann so ablaufen:
public class MainWindow
ctor(IDateiLoader) ...

Jetzt zu meinem Problem:
Der Dateiloader müsste beim CSV-Loader Infos enthalten, wie z.B. Trennzeichen (Semikolon, Komma, ...). Bei Excel sind event. wieder andere Infos für den Loader wichtig. Normalerweise wäre hier der ideale Weg, dass im Window bei CSV das Trennzeichen ausgewählt werden kann. Der Loader müsste dann IM WINDOW instanziiert werden. Als Konstruktorparameter wäre dann beim CSV-Loader das Trennzeichen mit anzugeben.

Mit DI funktioniert dies nicht, da die Instanziierung des Loaders ja bereits vor Erstellung des Windows erfolgt. Ungünstig, da hier ggfs. noch nicht bekannst ist, mit welchem Trennzeichen gearbeitet werden soll. Die Instanziierung im Window ist ungünstig, da ich ja dann eine feste Abhängigkeit zu der Lib habe, wo sich der Loader befindet.

Mir geht es in diesem Thread nicht speziell um dieses Loader-Beispiel, sondern einfach um die Thematik, wie ich mich verhalten soll, wenn im Konstruktor Parameter gefordert werden, die erst zur Laufzeit bekannt sind. Dies natürlich unter dem Gesichtspunkt der bestmöglichen Entkopplung. Ich bin zumindest der Meinung, dass bei einem austauschbaren Dateiloader, individuelle Parameter eines bestimmten Loaders in den Konstruktor gehören. Sollte hier jemand eine bessere Lösung haben, wäre ich für Infos sehr dankbar.

Eine Idee ist noch, in das Window eine virtuelle Factory Methode zu integrieren, die mir den Loader erstellt. So kann schnell eine Ableitung mit einem anderen Loader erstellt werden, ohne dabei den bestehenden Code anfassen zu müssen.

Mich würden hier mal Eure Meinungen interessieren, da ich immer wieder unschlüssig bin, wie ich mit diesem Problem umgehe. Zumindest stelle ich auch auf Grund meines o.g. Problems zur Zeit immer mehr diesen "Dependency-Injection-Wahn" in Frage.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 10.03.13 13:30 
Hallo,

ich habe mehrfach deinen Beitrag gelesen und bin mir aber nicht sicher, ob ich dich richtig verstanden habe (da ich z.Z. krank bin und ich gestern schon deinen Text überflogen habe, aber bisher keiner geantwortet hat, versuche ich es mal mit einer Antwort ;-))?

Generell ist DependencyInjection (DI) sicherlich sinnvoll, um Funktionalität austauschbar (und damit auch besser testbar) zu machen. Wenn du dann aber wiederum jeweils andere Parameter je Implementierung haben möchtest, so bist du den gedanklichen Weg nur halb gegangen. M.E. müßtest du dann auch wiederum die Parameter als vereinheitlichte Schnittstelle zur Verfügung stellen, d.h.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
interface IDateiLoaderParams
{
}

interface IDateiLoader
{
}

class CSVParams : IDateiLoaderParams
{
}

class CSVLoader
{
  public CSVLoader(IDateiLoaderParams)
  {
  }
}

Und bei der Instanziierung des CSVLoader würde man dann eine konkrete CSVParams-Instanz übergeben.

Und verwendest du denn einen bestimmten DI-Container?
Oppi35 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: So 10.03.13 18:32 
Hallo,

vielen Dank für Dein Posting.

..und genau hier liegt das Problem. Auch wenn ich die CSV-Argumente als Schnittstelle versehe, stehe ich trotzdem vor dem Problem, dass diese Argumente bereits zur Initialisierungszeit bekannt sein müssen. Wird jetzt aber beispielsweise erst in der Anwendungsoberfläche festgelegt, ob ein Komma oder ein Semikolon als Trennzeichen dient, stehe ich vor meinem Problem.

Ich habe auch schon eine Mischung aus DI und Strategy-Pattern versucht, aber die ideale Lösung habe ich noch nicht gefunden.

Gruß

Frank