Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Dependency Injection vs Service Locator -- dynamisches Erzeugung von Objekten

  Alt 1. Aug 2012, 14:47
Nun muss ich doch nochmals mein Thema aufgreifen und um Rat fragen. Ich sitze glaub irgendwie auf dem Schlauch und habe echt keine Ahnung, wie ich das Problem mittel Dependecy Injection lösen kann. Ich habe mal zwei Beispiele:
  • Ich habe eine Logger-Instanz, die mehrere Log-Writer bedienen kann. Log-Writer können z.B. in die Console Logs schreiben, in eine Datei oder in eine Datenbank. Wenn meine Applikation startet werden, je nach Konfiguration verschiedene Log-Writer erzeugt und dem Logger (Logger.AddWriter) übergeben. Evtl. kommen weitere Log-Writer noch während der Laufzeit hinzu -- ein Datenbank-Log-Writer kann z.B. erst dann hinzugefügt werden, wenn eine DB-Verbindung besteht.
  • Es wird eine Datenbank-Abfrage gestartet und daraus Objekte generiert. Es ist erst zur Laufzeit bekannt, wie viele Objekte es werden. Beispiel: Laden von Produkten.
So, nun habe ich einen Dependency-Container à la Spring für Delphi. Dependency Injection habe ich soweit nun auch verstanden, ebenso warum ich keinen Service Locator nutzen sollte.

Aber ich finde einfach keine sinnvolle Lösung, wie ich die obigen Probleme lösen kann. Ich komme leider immer wieder zu dem Punkt, dass ich auf den Service Locator zurückgreifen muss, um dynamisch eine beliebige Anzahl an Objekten erzeugen zu können.

Hier noch ein wenig Code, dass wir nicht nur über dieses total abstrakte Gelaber diskutieren müssen
Delphi-Quellcode:
function TUserFinder.Find(const Username: string): IList<IUser>;
var
  Query : IDbQuery;
begin
  Query := FDatabase.GetQuery();
  Query.SQL := 'SELECT * FROM Users WHERE username = :username';
  Query.Parameters.Add(':username', Username);
  Query.Open();
  try
    Result := TList<IUser>.Create();
    for each Dataset in Query.Results do
    begin
      //
      // User erzeugen ???
      //
      Result.Add(User);
    end;
  finally
    Query.Close();
  end;
end;
Oder habe ich überhaupt etwas falsch verstanden? Ich dreh mich gerade gedankelich leider nur noch im Kreis...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat