2

フォーム/コントロールクラスの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クラスを使用してこれを行う簡単な方法はありますか?

4

1 に答える 1

2

DIにSystem.IServiceProviderを使用しないでください。これは主に設計時の使用を目的としています。IComponent実装の場合、VSデザイナーはSiteプロパティに値を割り当てます。これにより、IServiceProviderメカニズム全体が機能しますが、そのプロパティは実行時にnullになります。つまり、GetServiceへのすべての呼び出しが失敗します。 。

Castle Windsor、StructureMapなどの適切なDIコンテナを使用することをお勧めします。

于 2009-09-22T11:25:08.777 に答える