Jak połączyć desygnowane komponenty z wtryskiem zależności

Podczas tworzenia desygnowanego komponentu .NET wymagane jest podanie domyślnego konstruktora. OdIComponent dokumentacja:

Aby być komponentem, klasa musi zaimplementować interfejs IComponent i dostarczyć podstawowy konstruktor, który nie wymaga żadnych parametrów ani pojedynczego parametru typu IContainer.

To sprawia, że ​​niemożliwe jest wykonanie wtrysku zależności za pomocą argumentów konstruktora. (Można udostępnić dodatkowe konstruktory, ale projektant je zignoruje.) Niektóre alternatywy rozważamy:

Lokalizator usług

Nie używaj wstrzykiwania zależności, zamiast tego użyj wzorca lokalizatora usług, aby uzyskać zależności. To wydaje się być tym, co IComponent.Site.GetService jest dla. Myślę, że moglibyśmy stworzyć implementację ISite wielokrotnego użytku (ConfigurableServiceLocator?), Którą można skonfigurować z niezbędnymi zależnościami. Ale jak to działa w kontekście projektanta?

Zastrzyk uzależnienia za pomocą właściwości

Wstrzykiwanie zależności przez właściwości. Podaj domyślne instancje, jeśli są niezbędne, aby pokazać komponent w projektancie. Dokumentuj, które właściwości należy wstrzyknąć.

Wstaw zależności za pomocą metody Initialize

Jest to bardzo podobne do wtrysku za pomocą właściwości, ale utrzymuje listę zależności, które należy wprowadzić w jednym miejscu. W ten sposób lista wymaganych zależności jest udokumentowana w sposób niejawny, a kompilator pomoże ci w popełnieniu błędów podczas zmiany listy.

Jakiś pomysł, jaka jest najlepsza praktyka? Jak ty to robisz?

edytować: Usunąłem „(np. WinForms UserControl)”, ponieważ pytanie to dotyczyło ogólnie komponentów. Komponenty dotyczą odwrócenia kontroli (patrz sekcja 8.3.1Specyfikacja UMLv2) więc nie sądzę, że „nie powinieneś wstrzykiwać żadnych usług” to dobra odpowiedź.

edytuj 2: Zabrało trochę zabawy z WPF i wzorcem MVVM, aby w końcu „uzyskać” odpowiedź Marka. Widzę teraz, że kontrole wizualne są rzeczywiście specjalnym przypadkiem. Jeśli chodzi o korzystanie z nie-wizualnych komponentów na powierzchniach projektantów, myślę, że model komponentów .NET jest zasadniczo niezgodny z wtryskiem zależności. Wydaje się, że zamiast tego został zaprojektowany wokół wzorca lokalizatora usługi. Może zacznie się to zmieniać wraz z infrastrukturą dodaną w .NET 4.0 wSystem.ComponentModel.Composition przestrzeń nazw.

questionAnswers(1)

yourAnswerToTheQuestion