So kombinieren Sie gestaltbare Komponenten mit der Abhängigkeitsinjektion

Wenn Sie eine designbare .NET-Komponente erstellen, müssen Sie einen Standardkonstruktor bereitstellen. Von demIComponent Dokumentation:

Um eine Komponente zu sein, muss eine Klasse die IComponent-Schnittstelle implementieren und einen Basiskonstruktor bereitstellen, der keine Parameter oder einen einzelnen Parameter vom Typ IContainer erfordert.

Dies macht es unmöglich, eine Abhängigkeitsinjektion über Konstruktorargumente durchzuführen. (Es könnten zusätzliche Konstruktoren bereitgestellt werden, aber der Designer würde sie ignorieren.) Einige Alternativen, die wir in Betracht ziehen:

Service Locator

Verwenden Sie keine Abhängigkeitsinjektion, sondern das Service-Locator-Muster, um Abhängigkeiten zu ermitteln. Dies scheint die IComponent.Site zu sein.GetService ist für. Ich denke, wir könnten eine wiederverwendbare ISite-Implementierung (ConfigurableServiceLocator?) Erstellen, die mit den erforderlichen Abhängigkeiten konfiguriert werden kann. Aber wie funktioniert das im Designerkontext?

Abhängigkeitsinjektion über Eigenschaften

Injizieren Sie Abhängigkeiten über Eigenschaften. Stellen Sie Standardinstanzen bereit, wenn diese zum Anzeigen der Komponente in einem Designer erforderlich sind. Dokumentieren Sie, welche Eigenschaften injiziert werden müssen.

Injizieren Sie Abhängigkeiten mit einer Initialize-Methode

Dies ähnelt der Injektion über Eigenschaften, enthält jedoch die Liste der Abhängigkeiten, die an einer Stelle injiziert werden müssen. Auf diese Weise wird die Liste der erforderlichen Abhängigkeiten implizit dokumentiert, und der Compiler unterstützt Sie bei Fehlern, wenn sich die Liste ändert.

Irgendeine Idee, was die beste Praxis hier ist? Wie machst du das?

bearbeiten: Ich habe "(z. B. ein WinForms-Benutzersteuerelement)" entfernt, da ich beabsichtigte, dass sich die Frage auf Komponenten im Allgemeinen bezieht. Bei den Komponenten dreht sich alles um die Umkehrung der Steuerung (siehe Abschnitt 8.3.1 der Bedienungsanleitung)UMLv2-SpezifikationIch denke also nicht, dass "Sie sollten keine Dienste injizieren" eine gute Antwort ist.

bearbeiten 2: Es hat ein wenig gedauert, mit WPF und dem MVVM-Pattern zu spielen, um Marks Antwort zu "bekommen". Ich sehe jetzt, dass visuelle Kontrollen in der Tat ein Sonderfall sind. Was die Verwendung nicht visueller Komponenten auf Designeroberflächen angeht, ist das .NET-Komponentenmodell meiner Meinung nach grundsätzlich nicht mit der Abhängigkeitsinjektion kompatibel. Es scheint stattdessen um das Service Locator-Muster herum entworfen worden zu sein. Möglicherweise ändert sich dies mit der in .NET 4.0 hinzugefügten Infrastruktur inSystem.ComponentModel.Composition Namespace.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage