容器、站台和元件
容器 (Container) 是一種特定的集合物件 (Collection Object),為一個或多個元件提供邏輯內含項目。 容器藉由提供可產生互動的 ISite 介面實作,管理元件彼此之間以及與外部應用程式環境的互動。 容器允許以先進先出的方式追蹤 (Tracking) 您的元件,也允許您利用索引來參考您的元件。 當您不再需要元件時,容器也提供一般處置方法來處置這些元件。
內含項目指的是邏輯內含項目,並非看得到,也非實體的內含項目。 容器封裝一或多個元件並提供與用戶端互動的包裝函式。 容器允許您加入及移除元件,語法如下:
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);
元件容器將會是 Container 類別的執行個體,或 IContainer 介面的實作。 Container 是此介面的參考實作。
指定元件名稱
您也可以在容器內指定您元件的名稱。 這個名稱在容器內必須是唯一的,且使用 Add 方法加以指定。
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");
管理資源和擴充容器
容器能夠集中管理與您元件關聯的資源。 當呼叫 Dispose 方法時,容器會自動呼叫所有包含之元件的 Dispose 方法,如此能夠確保立即釋放資源。
容器是可擴充的。 您可以自行建立繼承自 Container 的類別,並在其中加入自訂功能。 例如,您可能會建立一個容器,用來強制執行哪些元件可加入容器的規則 (Rule),如下範例所示:
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() ;
}
}
}
以上範例建立的新容器類別能夠強制執行哪些元件可加入容器的規則。 如果元件不是指定的類別 (範例中的 Widget),則會發生例外狀況。
當加入元件至容器時,容器會為元件建立站台。 這是 ISite 介面的實作,是透過元件的 Site 屬性而公開 (Expose)。 元件與其裝載容器的通訊是透過元件的 Site 屬性來建立的。 這個屬性 (Property) 代表的是元件的邏輯站台,由容器裝載。 不包含在容器當中的元件,會傳回該元件 Site 屬性的 null 參考。 Site 屬性允許您透過 ISite.Container 屬性取得容器介面的參考,或是透過 Component 屬性取得被裝載的元件介面的參考。
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)));
這兩個屬性 (Property) 都只傳回與這些物件相關的介面,而不是物件本身的參考。 請注意,元件也具有 Container 屬性,此屬性會傳回與 Container 相同的介面。 這個屬性是透過站台所提供,可以把它設想成捷徑。
如果您使用 Add 方法指派名稱給元件,就可透過 Name 屬性來擷取名稱。 如果容器具有相關聯的服務物件,則可透過 GetService 方法,由元件取得該物件的參考。
存取服務
您可以透過 GetService 方法存取各種服務。 這些服務針對將您的元件整合至設計環境,提供了大量支援。 如需詳細資訊,請參閱 HOW TO:存取設計階段服務 和設計階段架構。