Когато създавате проектируем .NET компонент, от вас се изисква да предоставите конструктор по подразбиране. От документацията на IComponent:
За да бъде компонент, класът трябва да имплементира интерфейса IComponent и да предостави основен конструктор, който не изисква параметри или един параметър от тип IContainer.
Това прави невъзможно инжектирането на зависимости чрез аргументи на конструктора. (Могат да бъдат предоставени допълнителни конструктори, но дизайнерът ще ги игнорира.) Някои алтернативи, които обмисляме:
Намиране на услуги
Не използвайте инжектиране на зависимости, вместо това използвайте модела за локатор на услуги, за да придобиете зависимости. Изглежда това е IComponent.Site.GetService за. Предполагам, че можем да създадем имплементация на ISite за многократна употреба (ConfigurableServiceLocator?), която може да бъде конфигурирана с необходимите зависимости. Но как работи това в дизайнерски контекст?
Инжектиране на зависимост чрез свойства
Инжектирайте зависимости чрез свойства. Осигурете екземпляри по подразбиране, ако са необходими за показване на компонента в дизайнер. Документирайте кои свойства трябва да бъдат инжектирани.
Инжектиране на зависимости с метод за инициализиране
Това много прилича на инжектиране чрез свойства, но поддържа списъка със зависимости, които трябва да бъдат инжектирани на едно място. По този начин списъкът с необходимите зависимости е документиран имплицитно и компилаторът ще ви помогне с грешки, когато списъкът се промени.
Имате ли идея коя е най-добрата практика тук? Как го правиш?
редактиране: Премахнах „(напр. WinForms UserControl)“, тъй като възнамерявах въпросът да бъде относно компонентите като цяло. Всички компоненти са свързани с инверсия на контрола (вижте раздел 8.3.1 от UMLv2 спецификация), така че не мисля, че „не трябва да инжектирате никакви услуги“ е добър отговор.
редактиране 2: Отне малко игра с WPF и модела MVVM, за да „получим“ най-накрая отговора на Марк. Сега виждам, че визуалният контрол наистина е специален случай. Що се отнася до използването на невизуални компоненти върху дизайнерски повърхности, мисля, че моделът на .NET компонент е фундаментално несъвместим с инжектирането на зависимости. Изглежда, че вместо това е проектиран около модела на локатора на услугата. Може би това ще започне да се променя с инфраструктурата, която беше добавена в .NET 4.0 в System.ComponentModel.Composition пространство от имена.