ist es möglich, IoC und Rich Domain zu verwenden? Gibt es dafür gute Beispiele, Open-Source-Projekte?
Ich nehme an, Sie meinen DI anstelle von IoC, und das Projekt, an dem Sie gearbeitet haben, verwendet einen DI-Container wie Spring. IoC hat zwei Hauptvarianten: DI und Locator-Muster. Ich verstehe nicht, warum das Locator-Muster ein Problem sein sollte, also konzentrieren wir uns auf DI.
Ich denke nicht, dass es möglich ist oder zumindest sehr unpraktisch wäre. Der Hauptaspekt von DI-Containern besteht darin, dass sie die Erstellung von Objekten steuern, wenn sie in andere Objekte ("verwaltete Objekte") eingefügt werden. Die Gruppe verwalteter Objekte, die bei Ausführung des Projekts aktiv ist, ist unabhängig davon, welche Domänenelemente in Ihrem Projekt vorhanden sind, hängt jedoch davon ab, wie Objekte verkabelt sind und welche Bereiche (Singleton, Prototyp) ihnen zugewiesen sind.
Aus diesem Grund möchten Sie nicht, dass der DI-Container Ihre Domänenobjekte verwaltet. Wenn Sie Objekte jedoch manuell erstellen (mit new), können Sie keine anderen Objekte in Ihre Domänenobjekte einfügen. (Potenzielle Umgehungsmöglichkeiten mit manueller Verkabelung bleiben hiervon unberührt.) Da Sie diese Injektionen benötigen, um Implementierungen durch andere zu ersetzen, können Sie die Funktionalität von Rich-Domain-Objekten mit DI nicht ersetzen. Daher möchten Sie keine Funktionalität in Domänenobjekte einfügen, oder Sie würden die Funktionen der DI verlieren.
Ich verstehe nicht, wie ein hypothetischer DI-Container funktionieren könnte, der Ihre Objekte nicht verwaltet, und keine der vorhandenen Implementierungen lässt dies zu. Man kann also mit Recht behaupten, dass DI auf die Verwaltung von Objekten angewiesen ist. Sie werden daher immer versucht, potenzielle Rich Domain-Objekte in eine anämische Klasse und eine oder mehrere Transaktionsskriptklassen aufzuteilen.