Compartir a través de


Comunicación entre contenedores y componentes

Actualización: noviembre 2007

Un contenedor es un nexo de comunicación entre la aplicación de cliente y el componente que contiene. Una aplicación puede obtener referencias a componentes del contenedor sin conocer el nombre o la identidad reales del componente. El componente también puede interaccionar con la aplicación de cliente a través del contenedor de diferentes maneras.

El objeto contenedor expone los componentes que contiene por medio de su propiedad Components. Esta propiedad es una propiedad indizada que devuelve un objeto de referencia IComponent. Los componentes se someten a un seguimiento en el que el primero en entrar es el primero en salir, y el acceso a ellos se realiza por medio del índice utilizando la sintaxis siguiente:

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];

Se pueden agregar componentes a un contenedor con o sin nombre. Si conoce el nombre del componente al que está haciendo referencia, puede obtener también la referencia a través del contenedor por medio de este nombre, como se muestra en el ejemplo siguiente:

xComponent = MyContainer.Components("myComponent")
xComponent = MyContainer.Components["myComponent"];

Observe que la propiedad Components devuelve una referencia IComponent, y no permite el acceso a los métodos y propiedades del componente que no estén implementados por esa interfaz.

El componente se comunica con el contenedor principalmente por medio de su propiedad Site. A través de Site, el componente puede obtener una referencia a la interfaz IContainer implementada por el contenedor, como se muestra a continuación:

Dim myComponent As New Component()
Dim myIContainer as IContainer
myIContainer = myComponent.Site.Container
Component myComponent = new Component();
IContainer myIContainer;
myIContainer = myComponent.Site.Container;

La propiedad Container también devuelve la misma referencia. Puede entenderse como un acceso directo: la referencia se sigue proporcionando a través del objeto ISite pero, en este caso, no de forma explícita.

El componente también puede obtener servicios del contenedor (si se suministran) mediante llamadas al método IServiceProvider.GetService. Este método devuelve un objeto del tipo especificado, como se muestra a continuación:

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;

Para recibir un objeto a través de GetService, debe estar implementado en una clase contenedora heredada. Es necesario reemplazar el método GetService de la clase Container e implementar código que suministre el objeto de servicio.

Vea también

Tareas

Cómo: Crear contenedores de componentes

Cómo: Extender contenedores de componentes

Conceptos

Contenedores, sitios y componentes