При создании проектируемого .NET-компонента вам необходимо предоставить конструктор по умолчанию. Из документации IComponent:
Чтобы быть компонентом, класс должен реализовывать интерфейс IComponent и предоставлять базовый конструктор, который не требует параметров или одного параметра типа IContainer.
Это делает невозможным внедрение зависимостей через аргументы конструктора. (Могут быть предоставлены дополнительные конструкторы, но дизайнер проигнорирует их.) Некоторые альтернативы, которые мы рассматриваем:
Поиск услуг
Не используйте внедрение зависимостей, вместо этого используйте шаблон локатора служб для получения зависимостей. Это похоже на IComponent.Site. GetService для. Я предполагаю, что мы могли бы создать многоразовую реализацию ISite (ConfigurableServiceLocator?), Которая может быть настроена с необходимыми зависимостями. Но как это работает в контексте дизайнера?
Внедрение зависимостей через свойства
Внедрить зависимости через свойства. Предоставьте экземпляры по умолчанию, если они необходимы для отображения компонента в дизайнере. Документируйте, какие свойства необходимо ввести.
Внедрение зависимостей с помощью метода инициализации
Это очень похоже на внедрение через свойства, но оно хранит список зависимостей, которые необходимо внедрить, в одном месте. Таким образом, список требуемых зависимостей неявно документируется, и компилятор будет помогать вам с ошибками при изменении списка.
Есть идеи, какая здесь лучшая практика? Как ты это делаешь?
edit: я удалил "(например, WinForms UserControl)", так как предполагал, что вопрос будет касаться компонентов в целом. Компоненты - это инверсия управления (см. Раздел 8.3.1 документа UMLv2 спецификация), поэтому я не думаю, что «вы не должны вводить какие-либо службы» - хороший ответ.
edit 2: потребовалось немного поиграть с WPF и шаблоном MVVM, чтобы наконец "получить" ответ Марка. Теперь я понимаю, что визуальные элементы управления - это действительно особый случай. Что касается использования невизуальных компонентов на дизайнерских поверхностях, я думаю, что модель компонентов .NET принципиально несовместима с внедрением зависимостей. Похоже, что вместо этого он разработан на основе шаблона локатора сервисов. Возможно, это начнет меняться с инфраструктурой, которая была добавлена в .NET 4.0 в System.ComponentModel.Composition.