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 27. Jan 2018 · letzter Beitrag vom 26. Mär 2018
 
Sequitar

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

Custom Constructor /DI bei factory-basierter Objekterstellung

  Alt 27. Jan 2018, 00:38
hallo, zusammen.
ich arbeite zzt relativ viel über DLL grenzen und hab das ganze auch schon gut mit interfaces und einer zentralen factory zur Registrierung und Erstellung neuer Typen hinbekommen.

Jetzt würde ich neben der bisherigen Vorgehensweise (Interfaces, Value access per properties )auch gerne objekte bereits bei der Erstellung mit startparametern ausstatten (incl. und besonders auch i.V.m Dependency injection).

Die Frage die sich mir stellt, ist wie ich hierzu eigens definierte / verdeckende constructoren einführe, die ich in einer Factory nutzen kann, was ja bei normaler Vererbung möglich ist (also z.b.
Delphi-Quellcode:
// in einer DLL registrierter Typ
Type
  Ix = Interface
    [GUID]
    Function Getint: Integer;
    Procedure Setint(Anint: Integer);
    Property Anint: Integer Read Getint Write Setint;
  End;

  Tx = Class(Tinterfacedobject, Ix)
  Private
    Fint: Integer;
    Function Getint: Integer;
    Procedure Setint(Anint: Integer);
  Public
    Constructor Create(Anint: Integer);
  End;

  { ... }
Constructor Tx.Create(Anint: Integer);
Begin
  Fint := Anint;
End;

Function Tx.Getint: Integer;
Begin
  Result := Fint;
End;

Procedure Tx.Setint(Anint: Integer);
Begin
  Fint := Anint;
End;

Initialization

// globale factory, oder davon abgeleitet: Txfactory=Tfactory<TX>;
Txfactory.Register(Tx); // läuft soweit

Finalization

Txfactory.Unregister(Tx);
in anderer unit /anderem DLL modul soll dann sowas aufgerufen werden
Delphi-Quellcode:
Procedure New;
Var
  Xclass: Txclass;
  // txclass ist der hauptanwendung und anderen modulen ja an sich unbekannt, daher später vlt
  // Var xclass:tinterfacedclass;
  X,y: Tinterfacedobject;
Begin
  Xclass := Txclass { Tinterfacedclass } (Txfactory.Getclass('tx'));//txclass i.A. unbekannt, da in externer DLL definiert und registriert. steht jetz nur mal so da zur verdeutlichung.
  // custom constructor, future dependency injection planned
  X := Xclass.Create(5);
//oder auch möglich
y:=txfactory.new('tx');
  // << << Wie Kann Ich in beiden fällen Auf Den Custom Constructor Von Tx Zugreifen ? TX und TXclass sind normal ausserhalb der DDL unbekannt
  Assert((X as ix).Anint = 5);
  X.Free;
  y.free;
End;
bisher mach ich das dann so, kann aber keine dependencies mitgeben //fehlende konstructoren:
Delphi-Quellcode:
procedure new;
var x,y:ix;
xclass:tinterfacedclass;
 Xclass := Tinterfacedclass{Txclass}(Txfactory.Getclass('tx'));
        // custom constructor, future dependency injection planned
 X := Xclass.create as ix;//<<<< wie kann ich hier auf den custom constructor von tx zugreifen?
x.anint:=5;
 Assert(X.Anint = 5);
x:=nil;
//oder so:
y:=txfactory.new('tx')as ix;
y.anint:=42;
y:=nil;
{...}
ich könnte mir auch vorstellen, die jeweiligen constructoren direkt mit in der factory zu registrieren (reference to constructor gibts aber leider nicht, theoretisch würde das mein problem ja lösen, aber ich weiss einfach nicht wie das zu realisieren ist)
also sowas in der art:
txfactory.register(tx,tx.create({custom parameters}));

Geändert von Sequitar (27. Jan 2018 um 00:57 Uhr)
  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 11:38 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 by Thomas Breitkreuz