デザイン可能な .NET コンポーネントを作成するときは、既定のコンストラクターを指定する必要があります。IComponentのドキュメントから:
コンポーネントになるには、クラスは IComponent インターフェイスを実装し、パラメーターを必要としないか、タイプ IContainer の単一のパラメーターを必要とする基本的なコンストラクターを提供する必要があります。
これにより、コンストラクター引数を介して依存性注入を行うことができなくなります。(追加のコンストラクターを提供することもできますが、デザイナーはそれらを無視します)。
サービスロケーター
依存関係の挿入を使用しないでください。代わりに、サービス ロケーター パターンを使用して依存関係を取得してください。これは、IComponent.Site. GetServiceはそのためのものです。必要な依存関係で構成できる再利用可能な ISite 実装 (ConfigurableServiceLocator?) を作成できると思います。しかし、これはデザイナーのコンテキストではどのように機能するのでしょうか?
プロパティによる依存性注入
プロパティを介して依存関係を注入します。デザイナーでコンポーネントを表示するために必要な場合は、既定のインスタンスを提供します。注入する必要があるプロパティを文書化します。
Initialize メソッドで依存関係を注入する
これはプロパティを介した注入によく似ていますが、注入する必要がある依存関係のリストを 1 か所に保持します。このようにして、必要な依存関係のリストが暗黙的に文書化され、コンパイラーはリストが変更されたときにエラーを支援します。
ここでベストプラクティスは何ですか?どのようにしますか?
edit : コンポーネント全般に関する質問をするつもりだったので、「(例: WinForms UserControl)」を削除しました。コンポーネントはすべて制御の反転に関するものなので ( UMLv2 仕様のセクション 8.3.1 を参照)、「サービスを注入してはならない」というのは良い答えではないと思います。
編集2:最終的にマークの答えを「得る」には、WPFとMVVMパターンをいじる必要がありました。ビジュアル コントロールは確かに特殊なケースであることがわかりました。デザイナー サーフェイスでの非ビジュアル コンポーネントの使用に関しては、.NET コンポーネント モデルは基本的に依存性注入と互換性がないと思います。代わりに、サービス ロケーター パターンを中心に設計されているようです。おそらく、これは、.NET 4.0 でSystem.ComponentModel.Composition名前空間に追加されたインフラストラクチャで変わり始めるでしょう。