IOC zur Kompilierungszeit


11

Hat jemand ein Projekt gestartet, um IOC zur Kompilierungszeit auszuführen (möglicherweise mit Roslyn oder Linq MethodInfo emit)?

Meine Erfahrung mit IOC-Containern war bisher großartig, mit ein paar kleinen Problemen

  1. Viele IOC-Container starten nur langsam, da hier ein Großteil der Auflösungslogik auftritt
  2. Es ist oft schwierig sicherzustellen, dass eine Auflösung möglich ist, da die Kompilierung nicht mehr sicherstellt, dass der Konstruktor aufgerufen werden kann
  3. Oft erhöhen IOC-Container die Laufzeit um einen kleinen Overhead (einige sind nicht einmal klein, oft laufen diejenigen, die schnell starten, langsam).

Es scheint mir, dass die ideale Lösung darin besteht, der Build-Kette einen Kompilierungsschritt hinzuzufügen, der anstelle von IOC eine Factory-Klasse hinzufügt.

Hat das schon mal jemand gemacht? Wenn nicht, warum nicht?

Antworten:


4

Dies zu tun sollte kein solches Problem sein. Führen Sie einfach dieselbe IoC-Logik aus, und anstatt die Klassen zu instanziieren, geben Sie Code aus, der die Instanziierung ausführt.

Auf diese Weise entfernen Sie jedoch einen großen Vorteil von IoC: Die Möglichkeit, die Zusammensetzung der Coponents zu ändern, ohne die gesamte Anwendung neu kompilieren zu müssen. Durch einfaches Ersetzen der Konfiguration kann die Anwendung verschiedene Dienste oder Datenquellen verwenden. Und obwohl ich noch keine Anwendung gesehen habe, die diese Funktion voll ausnutzen würde, ist sie immer noch ein wesentlicher Teil des Erfolgs von IoC.


Ja, ich weiß, dass es möglich ist. Aber ich habe noch keinen IoC-Container gesehen, der das macht. Ich habe auch festgestellt, dass der aktuelle Trend zur Registrierung in Code (fließende APIs) zu gehen scheint. Angesichts dessen denke ich darüber nach, diesen IoC-Container zu schreiben.
ArTs

Ich scheine mich zu erinnern, dass Hiro ( github.com/philiplaureano/Hiro ) seine Sachen zur Kompilierungszeit machen könnte.
lzcd

2
"Auf diese Weise entfernen Sie jedoch einen großen Vorteil von IoC: Die Möglichkeit, die Zusammensetzung der Coponents zu ändern, ohne die gesamte Anwendung neu kompilieren zu müssen." Es scheint mir, dass es übertrieben ist, dies auf die gesamte Anwendung anzuwenden. Sie verwandeln jeden Teil der Anwendung in ein Plug-In. Darüber hinaus sollten beide Techniken nebeneinander existieren können - es gibt keinen Grund, warum Sie einige der Komponenten zur Kompilierungszeit und einige zur Laufzeit nicht verkabeln können.
Doval

Ich sehe keinen großen Vorteil. In welchem ​​Kontext ersetzen Sie Komponenten zur Laufzeit vollständig? Ein paar Konfigurationsanwendungsfälle vielleicht?
andyczerwonka

4

Dolch für Java / Android macht das. Es opfert etwas Laufzeitmagie (wie die von Guice), um eine fast vollständige Codegen-Erfahrung zur Kompilierungszeit zu bieten, einschließlich der Konvertierung der meisten Laufzeitfehler in Kompilierungsfehler.

Wäre auch in .NET cool.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.