Condividi tramite


Comunicazione tra contenitori e componenti

Un contenitore è un legame di comunicazione tra l'applicazione client e i componenti in essa contenuti. Un'applicazione può ottenere riferimenti ai componenti all'interno del contenitore senza che sia noto il nome effettivo o l'identità del componente. Il componente può anche interagire in diversi modi con l'applicazione client attraverso il contenitore.

L'oggetto contenitore espone i componenti in esso contenuti attraverso la proprietà Components, ovvero una proprietà indicizzata che restituisce un oggetto di riferimento a IComponent. I componenti vengono rilevati in base al principio "first-in/first-out" e sono accessibili tramite l'indice, mediante la seguente sintassi:

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

È possibile aggiungere componenti a un contenitore con o senza nome. Se si conosce il nome del componente cui si fa riferimento, sarà possibile utilizzarlo anche per ottenere il riferimento tramite il contenitore, come illustrato nell'esempio seguente:

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

Si noti che la proprietà Components restituisce un riferimento a IComponent e non consente l'accesso ai metodi e alle proprietà del componente non implementati da quell'interfaccia.

Il componente comunica con il contenitore principalmente tramite la proprietà Site. Tramite Site, il componente può ottenere un riferimento all'interfaccia IContainer implementata dal contenitore, come mostrato di seguito:

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

Lo stesso riferimento viene restituito anche dalla proprietà Container, che può essere considerata come un collegamento: il riferimento viene comunque fornito tramite l'oggetto ISite, ma in modo non esplicito.

Il componente può ottenere inoltre eventuali servizi dal contenitore chiamando il metodo IServiceProvider.GetService che restituisce un oggetto del tipo specificato, come mostrato di seguito:

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;

Per ricevere un oggetto tramite GetService, è necessario implementarlo in una classe di contenitori ereditata. Il metodo GetService della classe Container deve essere sottoposto a override e il codice per la fornitura dell'oggetto servizio deve essere implementato.

Vedere anche

Attività

Procedura: creare contenitori di componenti

Procedura: estendere i contenitori di componenti

Concetti

Contenitori, siti e componenti