容器和组件之间的通信
容器是客户端应用程序和它所包含的组件之间的通信纽带。 应用程序不用知道容器中组件的实际名称或标识,就可以获取对组件的引用。 组件也可以用各种方法通过容器与客户端应用程序交互。
容器对象通过其 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 方法从容器获取服务(如果提供了这些服务)。 此方法返回指定类型的对象,如下所示:
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 方法,以提供实现的服务对象。