コンテナとコンポーネントの間のやり取り
更新 : 2007 年 11 月
コンテナは、それに含まれるコンポーネントとクライアント アプリケーションとの間のやり取りを媒介するものです。アプリケーションは、コンポーネントの実際の名前や ID を知らなくても、コンテナ内でコンポーネントへの参照を取得できます。コンポーネントは、コンテナを通じてさまざまな方法でクライアント アプリケーションとやり取りできます。
コンテナ オブジェクトは、Components プロパティを使用して、コンテナ オブジェクトに含まれるコンポーネントを公開します。このプロパティは、IComponent 参照オブジェクトを返すインデックス付きプロパティです。コンポーネントは先入れ先出し方式で追跡され、次の構文を使用してインデックスを通じてアクセスできます。
Imports System.ComponentModel
Dim MyContainer As Container
Dim xComponent as IComponent
xComponent = MyContainer.Components(0)
using System.ComponentModel;
Container MyContainer = new Container();
IComponent xComponent;
xComponent = MyContainer.Components[0];
コンポーネントは、名前を付けて、または名前なしでコンテナに追加できます。参照するコンポーネントの名前がわかっている場合は、次の例に示すように、コンテナ内でその名前を使用しても参照を取得できます。
xComponent = MyContainer.Components("myComponent")
xComponent = MyContainer.Components["myComponent"];
Components プロパティは IComponent 参照を返します。そのインターフェイスによって実装されていないコンポーネントのメソッドやプロパティにはアクセスできません。
コンポーネントは、主に Site プロパティを使用してコンテナとやり取りします。次に示すように、コンポーネントは Site を通じて、コンテナによって実装されている IContainer インターフェイスへの参照を取得できます。
Dim myComponent As New Component()
Dim myIContainer as IContainer
myIContainer = myComponent.Site.Container
Component myComponent = new Component();
IContainer myIContainer;
myIContainer = myComponent.Site.Container;
同じ参照が Container プロパティでも返されます。これはショートカットと考えることができます。この場合も参照は ISite オブジェクトによって返されますが、明示的ではありません。
コンポーネントは IServiceProvider.GetService Method を呼び出してコンテナからサービスを取得することもできます。このメソッドは、次に示すように、指定された型のオブジェクトを返します。
Dim myComponent As Component
Dim myWidget As Widget
Dim serviceObject As Object
' This returns an object of type Widget that is supplied by the container.
serviceObject = myComponent.Site.GetService(GetType(Widget))
myWidget = CType(serviceObject, Widget)
Component myComponent = new Component();
Widget myWidget;
object serviceObject;
// This returns an object of type Widget that is supplied by the container.
serviceObject = myComponent.Site.GetService(System.Type.GetType("CommunicateCS.Widget"));
myWidget = (Widget)serviceObject;
GetService を使用してオブジェクトを取得するには、継承されたコンテナ クラスにオブジェクトが実装されている必要があります。Container クラスの GetService メソッドをオーバーライドして、実装されたサービス オブジェクトを提供するようにコーディングします。