フォーム/コントロールクラスの1つにサービスが追加されたときに、ビジネスロジックコンポーネントがサービスをクエリできるようにしようとしています。たとえばClientManager
、ライブラリにビジネスロジックをカプセル化するクラスがあるとします。動作する必要のあるデータをクエリするILoginManager
インスタンスが必要です。
具体的なILoginManager
インスタンスは、たとえばシングルトンとしてWinFormsアプリケーションで作成されます。ClientManager
コンポーネントをフォームにドロップできるようにしたいと思います。これにより、ILoginManager
インスタンスをコンポーネントで自動的に使用できるようになります。
軽量コンテナに関するこの記事から私が理解していることから、GetServiceを使用することでこれを達成できます。
public class ClientManager : Component
{
public ClientManager() {}
public ClientManager(IContainer container) {
container.Add(this);
}
public ILoginManager User
{
// would really be cached in a private field
get { return GetService(typeof(ILoginManager)) as ILoginManager; }
}
// does something that requires the User property to be set
public void DoSomething();
}
次に、GetServiceをオーバーライドしてインスタンスを返すコンテナーを作成します。
public class MyContainer : Container
{
ServiceContainer svc;
public MyContainer() {
svc = new ServiceContainer();
svc.AddService(typeof(ILoginManager), GlobalAppStuff.LoginManager);
}
protected override object GetService(Type service) {
return svc.GetService(service);
}
}
System.ComponentModel.Container
スタンドアロンソリューションとして、これは正常に機能しますが、デザイナーは常にデフォルトコンテナーを生成し、それにサービスを注入する方法がわからないため、これを設計可能なコントロールに統合する方法がわかりません。
MSDNのドキュメントでは、これらの概念を実際にどのように使用するかについて説明があいまいです。設計者にとって使いやすいComponentModelクラスを使用してこれを行う簡単な方法はありますか?