Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#15

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 23. Sep 2011, 20:27
Proxies von Interfaces scheinen mir hier am sinnvollsten zu sein.

Mir fallen da spontan ein paar Wege ein:
  • TVirtualInterface
    In XE2 kam die Klasse TVirtualInterface hinzu. Die sollte dir schonmal einen Ansatz geben, um zur Laufzeit eine Implementierung eines Interfaces zu erzeugen.
    Was in Delphi halt immer noch komplett bescheuert (höflich ausgedrückt) ist, ist, dass man immer noch ewig viel hässlichen Code tippen muss, nur um eine dumme Property in ein Interface zu kriegen.
    Du musst also immer noch komplett hirnlose Getter/Setter schreiben und die Property selbst auch noch.
    Gibt aber schlimmeres denke ich mal.
    Collection-Properties würdest du initialisieren, da bräuchte man dann nur einen Getter,
    Als zugrundeliegenden Store für die Properties könntest du ein Dictionary und TValue nehmen.
  • Maschinencode zur Laufzeit erzeugen
    Wenn du die TVirtualInterface-Lösung am Laufen hast, kannst du ja versuchen tatsächliche Klassen zur Laufzeit zu erzeugen.
    Aber ohne IL/Byte-Code ist das gleich mal 100-mal aufwendiger und instabiler. In IL gibt es eine Exception, wenn der IL Code nicht verifiziert, in native Delphi schreibst du fröhlich irgendwas irgendwohin und 10 Minuten später knallt es an einer ganz anderen Stelle.
    Nur mit so einem Runtime-Codegen könntest du auch dynamisch Proxies für Klassen erzeugen.
  • Automatisch erzeugte Proxies zur Compilezeit
    Ein einfacherer Weg wäre es wohl, wenn du es zur Pflicht machst, dass dein Modell in einem Package liegt.
    Dann könntest du dieses im Post-Build laden, die Typen finden und nun relativ einfach die Proxies als Delphi Code erzeugen.
    Die fertige App muss ja deshalb noch lange keine Runtime-Packages benötigen, wäre also keine so schlimme Einschränkung.
    Der erzeugte Code müsste dann nur irgendwo so registriert werden, dass dein ORM weiß, wie er zur Laufzeit die Proxies finden kann.
    Das hier würde es auch ermöglichen, Klassen anstatt Interfaces für das Modell nehmen zu können.
    Denn zirkuläre Bezüge bringen das autom. Referenzzählen immer durcheinander, und ein Modell ohne die Möglichkeit den Graph hoch & runter zu navigieren ist bekanntlich grauenvoll.

btw: Ich weiß nicht wieweit tiOpf ist. In meinen alten Delphi-Tagen fand ich es immer ein wenig zu einschränkend und creepy. Aber das muss ja gar nicht mehr so sein.
Damit hättest du das Thema ORM/OPF abgehakt.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”

Geändert von Elvis (23. Sep 2011 um 20:29 Uhr)
  Mit Zitat antworten Zitat