AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Custom Constructor /DI bei factory-basierter Objekterstellung
Thema durchsuchen
Ansicht
Themen-Optionen

Custom Constructor /DI bei factory-basierter Objekterstellung

Offene Frage von "freimatz"
Ein Thema von Sequitar · begonnen am 26. Jan 2018 · letzter Beitrag vom 26. Mär 2018
 
Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Custom Constructor /DI bei factory-basierter Objekterstellung

  Alt 7. Feb 2018, 10:34
Hab das jetzt so zu lösen versucht. Nicht elegant und definitiv ausbaufähig(je nachdem wo man als nächstes gegen eine wand läuft) //bisher fiel mir keine bessere Lösung ein für das problem, als ein neues interface einzuführen auf das bei erstellung geprüft wird und bei erfolg die enstprechenden abhängigkeiten mitgegeben werden. Man KÖNNTE das dann wohl auch über delegates den einzelen objekten mitgeben, damit die nicht so "hässlich" werden. Die frage bleibt ob das nicht auch einfacher / eleganter geht??
Delphi-Quellcode:
Type
//Nachteil? IInjectable müsste dann von jedem "abhängigen" object implementiert werden (zb auch über delegates)

  Iinjectable = Interface
    ['{ECC8E26C-7D14-43FD-9247-066435DAEDA4}']
    Procedure Inject(Dependencies: Array Of Iinterface);
    // Function DependsOn(Dependency: Tobject): Boolean;
  End;

  Tinjectfactory = Class(Tifactory) Class
  Function New(Classname: String; Dependencies: Array Of IInterface)
    : Iinterface;overload; Static;
  End;
//[...]
Class Function Tinjectfactory.New(Classname: String;
  Dependencies: Array Of IInterface): Iinterface;
Var
  Temp: Iinjectable;
Begin
  Result := {inherited} New(Classname);//new(param:string)inherited from parent class
  Try
    If Supports(Result, Iinjectable, Temp)
    Then
      Temp.Inject(Dependencies);
  Except
    Raise
  End;
End;

//Nutzungsbeispiel

Procedure Tinjecttest.Test_factoryinject;
Var
  Parent: Iinterface;
  Bla: Ibla;
Begin
  Try
    Tinjectfactory.Register([Tinjectabletestobject, Tbla, Tblub]);
    Parent := Tinjectfactory.New('Tinjecttest.Tinjectabletestobject',
      [Tbla.Create, Tblub.Create]); //statt direkterstellung auch zb verschachtelung mehrerer "abhängiger" factoryaufrufe
    // assert(iinjectable(parent).dependson())
    (Parent As Ibla).Bla;
    (Parent As Iblub).Blub;
    Bla := Parent As Ibla;
    Bla.Bla;
    Tinjectfactory.UnRegister([Tinjectabletestobject, Tbla, Tblub]);
  Except
    On E: Exception Do
      Raise E
  End;
End;

Geändert von Sequitar ( 7. Feb 2018 um 12:50 Uhr) Grund: Beispiel eingefügt; Formatierung
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz