Como combinar componentes designáveis ​​com injeção de dependência

Ao criar um componente .NET projetável, você é obrigado a fornecer um construtor padrão. DeIComponent documentação:

Para ser um componente, uma classe deve implementar a interface IComponent e fornecer um construtor básico que não requer parâmetros ou um único parâmetro do tipo IContainer.

Isso impossibilita a injeção de dependência via argumentos de construtor. (Construtores extras poderiam ser fornecidos, mas o projetista os ignoraria.) Algumas alternativas que estamos considerando:

Localizador de serviço

Não use injeção de dependência, em vez disso, use o padrão localizador de serviço para adquirir dependências. Este parece ser o que IComponent.Site.GetService é para. Eu acho que nós poderíamos criar uma implementação de ISite reutilizável (ConfigurableServiceLocator?) Que pode ser configurada com as dependências necessárias. Mas como isso funciona em um contexto de designer?

Injeção de Dependência via propriedades

Injetar dependências por meio de propriedades. Forneça instâncias padrão, se elas forem necessárias para mostrar o componente em um designer. Documente quais propriedades precisam ser injetadas.

Injetar dependências com um método Initialize

Isso é muito parecido com a injeção via propriedades, mas mantém a lista de dependências que precisam ser injetadas em um só lugar. Dessa forma, a lista de dependências necessárias é documentada implicitamente, e o compilador o ajudará com erros quando a lista for alterada.

Alguma ideia de qual é a melhor prática aqui? Como você faz isso?

editar: Eu removi "(por exemplo, um WinForms UserControl)" desde que eu pretendia que a questão seja sobre os componentes em geral. Componentes são todos sobre inversão de controle (veja seção 8.3.1 doEspecificação UMLv2Então eu não acho que "você não deve injetar nenhum serviço" é uma boa resposta.

editar 2: Demorou alguns jogando com WPF e o padrão MVVM para finalmente "obter" a resposta de Mark. Eu vejo agora que controles visuais são de fato um caso especial. Quanto ao uso de componentes não-visuais em superfícies de designer, acho que o modelo de componente .NET é fundamentalmente incompatível com a injeção de dependência. Parece ser projetado em torno do padrão de localizador de serviço. Talvez isso comece a mudar com a infraestrutura que foi adicionada no .NET 4.0 noSystem.ComponentModel.Composition namespace.

questionAnswers(1)

yourAnswerToTheQuestion