Freigeben über


Container, Sites und Komponenten

Ein Container ist ein spezialisiertes Auflistungsobjekt, das die logische Kapselung für eine oder mehrere Komponenten bereitstellt. Container sind für die Interaktion zwischen einzelnen Komponenten untereinander sowie zwischen Komponenten und der externen Anwendungsumgebung verantwortlich. Dazu stellen sie eine Implementierung der ISite-Schnittstelle bereit, über die die Interaktion erfolgen kann. Mit dem Container können die Komponenten nach dem First-in/First-out-Prinzip überwacht werden. Darüber hinaus können Sie über einen Index auf die einzelnen Komponenten verweisen. Der Container stellt außerdem eine allgemeine Möglichkeit bereit die Komponenten, die nicht mehr benötigt werden, zu entfernen.

Kapselung steht für die logische Kapselung, nicht für die visuelle oder physikalische Kapselung. Der Container kapselt eine oder mehrere Komponenten ein und stellt einen Wrapper bereit, über den Clients interagieren können. Mit der folgenden Syntax können Sie Komponenten zum Container hinzufügen oder daraus entfernen:

Imports System.ComponentModel
Dim myComponent As New Component()
Dim myContainer As New Container()
myContainer.Add(myComponent)
myContainer.Remove(myComponent)
using System.ComponentModel;
Component myComponent = new Component();
Container myContainer = new Container();
myContainer.Add(myComponent);
myContainer.Remove(myComponent);

Ein Komponentencontainer ist entweder eine Instanz der Container-Klasse oder eine Implementierung der IContainer-Schnittstelle. Container ist die Verweisimplementierung dieser Schnittstelle.

Angeben eines Komponentennamens

Sie können auch einen Namen für die Komponente im Container angeben. Dieser Name muss innerhalb des Containers einmalig sein und mit der Add-Methode angegeben werden.

Dim myComponent As New Component()
Dim myContainer As New Container()
MyContainer.Add(myComponent, "ThisComponent")
Component myComponent = new Component();
Container myContainer = new Container();
myContainer.Add(myComponent, "ThisComponent");

Verwalten von Ressourcen und Erweitern von Containern

Container stellen eine zentrale Möglichkeit dar, Ressourcen für Komponenten zu verwalten. Wenn die Dispose-Methode aufgerufen wird, ruft der Container automatisch die Dispose-Methode aller enthaltenen Komponenten auf. Dadurch wird sichergestellt, dass die Ressourcen sofort freigegeben werden.

Container sind erweiterbar. Sie können eine eigene Klasse erstellen, die aus Container erbt, worin wiederum die benutzerdefinierte Funktionalität enthalten ist. Sie können beispielsweise einen Container erstellen, mit dem Regeln erzwungen werden, die festlegen, welche Komponenten dem Container hinzugefügt werden können. Beispiel:

Public Class MyContainer
   Inherits Container
   Public Overloads Overrides Sub Add(ByVal component As IComponent)
      ' Checks to see if the component is allowed to join this container.
      If TypeOf component Is Widget Then
         ' Calls the Add method of the base class, and adds the component.
         MyBase.Add(component)
      Else
         ' If the component is not allowed, an exception is thrown.
         Throw New NonWidgetException()
      End If
   End Sub
End Class
class MyContainer : Container
{
   public override void Add(IComponent component)
   {
      // Checks to see if the component is allowed to join this container.
      if (component is Widget)
      {
         base.Add(component);
      }
      else
      {
         throw new NonWidgetException();
      }
   }
}
class MyContainer extends Container
{
   public void Add(IComponent component) throws NonWidgetException
   {
      // Checks to see if the component is allowed to join this container.
      if (component instanceof Widget) 
      {
         super.Add(component);
      }
      else
      {
         throw new NonWidgetException() ;
      }
   }
}   

Mit diesem Beispiel wird eine neue Containerklasse erstellt, mit der eine Regel erzwungen wird, die festlegt, welche Komponenten im Container aufgenommen werden können. Wenn eine Komponente nicht die angegebene Klasse aufweist (in diesem Fall Widget), wird eine Ausnahme ausgelöst.

Wird eine Komponente einem Container hinzugefügt, so erstellt der Container eine Site für sie. Dies ist eine Implementierung der ISite-Schnittstelle, die über die Site-Eigenschaft der Komponente verfügbar gemacht wird. Die Kommunikation einer Komponente mit ihrem Hostcontainer erfolgt über die Site-Eigenschaft der Komponente. Diese Eigenschaft entspricht der logischen Site der Komponente und befindet sich im Container. Eine Komponente, die nicht in einem Container enthalten ist, gibt einen null-Verweis für ihre Site-Eigenschaft aus. Mit der Site-Eigenschaft können Sie über die ISite.Container-Eigenschaft einen Verweis auf die Containerschnittstelle abrufen bzw. über die Component-Eigenschaft einen Verweis auf die Komponentenschnittstelle.

Dim myComponent As New Component
Dim myContainer As New Container
myContainer.Add(myComponent)
Dim myIComponent as IComponent
Dim myIContainer as IContainer
myIComponent = myComponent.Site.Component
myIContainer = myComponent.Site.Container
' These two messages display True.
MessageBox.Show("Are the components equal? " & _
   myComponent.Equals(myIComponent).ToString)
MessageBox.Show("Are the containers equal? " & _
   myContainer.Equals(myIContainer).ToString)
Component myComponent = new Component();
Container myContainer = new Container();
myContainer.Add(myComponent);
IComponent myIComponent;
IContainer myIContainer;
myIComponent = myComponent.Site.Component;
myIContainer = myComponent.Site.Container;
MessageBox.Show("Are the components equal? " + 
   myComponent.Equals(myIComponent).ToString());
MessageBox.Show("Are the containers equal? " + 
   myContainer.Equals(myIContainer).ToString());
Component myComponent =  new Component();
Container myContainer =  new Container();
myContainer.Add(myComponent);
IComponent myIComponent;
IContainer myIContainer;
myIComponent = myComponent.get_Site().get_Component();
myIContainer = myComponent.get_Site().get_Container();
MessageBox.Show("Are the components equal? " 
   + System.Convert.ToString(myComponent.Equals(myIComponent)));
MessageBox.Show("Are the containers equal? " 
   + System.Convert.ToString(myContainer.Equals(myIContainer)));

Beide Eigenschaften geben nur die Schnittstelle aus, die mit den Objekten verbunden ist, keinen Verweis auf die Objekte an sich. Beachten Sie, dass die Komponente auch über eine Container-Eigenschaft verfügt, die die gleiche Schnittstelle wie Container zurückgibt. Diese Eigenschaft wird durch die Site bereitgestellt und kann als Verknüpfung betrachtet werden.

Wenn Sie der Komponente mit der Add-Methode einen Namen zuweisen, kann der Name über die Name-Eigenschaft abgerufen werden. Wenn dem Container ein Dienstobjekt zugewiesen ist, kann mit der Komponente über die GetService-Methode ein Verweis auf dieses Objekt abgerufen werden.

Zugreifen auf Dienste

Sie können über die GetService-Methode auf eine Vielzahl von Diensten zugreifen. Diese Dienste bieten umfassende Unterstützung für die Integration der Komponenten in die Entwurfsumgebung. Weitere Informationen finden Sie unter Gewusst wie: Zugriff auf Entwurfszeitdienste und Architektur der Entwurfszeit.

Siehe auch

Aufgaben

Gewusst wie: Erstellen von Komponentencontainern

Gewusst wie: Erweitern von Komponentencontainern

Gewusst wie: Zugriff auf Entwurfszeitdienste

Konzepte

Kommunikation zwischen Containern und Komponenten

Architektur der Entwurfszeit