Contêiner, sites, e componentes
Um recipiente é um objeto da coleção especializada que fornece a retenção lógica para um ou mais componentes.Contêiners gerenciam a interação de componentes entre si, assim como com o ambiente de aplicativo, fornecendo uma implementação da interface de ISite através das interações que podem ocorrer.O contêiner permite controlar um dos seus componentes na primeira em, na primeira - out base, e permite-lhe consultar seus componentes por um índice.O contêiner também fornece meios para disposição de comum de seus componentes quando você não tem a necessidade de eles.
A retenção se refere a retenção lógica, a retenção não visual ou físico.O contêiner encapsula um ou mais componentes e fornece um wrapper através do qual os clientes podem interagir.O contêiner permite que você adicione e remova componentes na seguinte sintaxe:
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);
Um contêiner componente será uma instância da classe de Container , ou uma implementação da interface de IContainer .Container é a implementação de referência de esta interface.
Especificando um nome componente
Você também pode especificar um nome para o componente no recipiente.Este nome deve ser exclusivo dentro do contêiner, e é especificado usando o método de 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");
Gerenciando recursos e estender contêiner
Contêiners fornecem um recurso central para gerenciar os recursos associados com os componentes.Quando o método de Dispose é chamado, o contêiner automaticamente chama o método de Dispose de todos os componentes contidos, garantindo assim que os recursos são liberados imediatamente.
Os recipientes são extensíveis.Você pode criar sua própria classe que herda de Container que incorpora funcionalidade personalizada.Por exemplo, você pode criar um contêiner que impõe regras que regem componentes que podem ser adicionados para o recipiente, como são mostradas no exemplo a seguir:
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();
}
}
}
O exemplo anterior cria uma nova classe do contêiner que pode impor uma regra sobre os componentes podem se juntar para o contêiner.Se um componente não é da classe especificada (em este caso, Widget), uma exceção é lançada.
Quando um componente é adicionado a um recipiente, o contêiner cria um site para ele.Esta é uma implementação da interface de ISite que é exposto através da propriedade de Site do componente.Comunicação por um componente com seu contêiner host é realizada através da propriedade de Site do componente.Esta propriedade representa o site lógica do componente, e está hospedada pelo recipiente.Um componente que não está contido no de um contêiner uma referência de null para sua propriedade de Site .A propriedade de Site permite que você obtenham uma referência para a interface de contêiner através da propriedade de ISite.Container , ou uma referência à interface componente que está sendo hospedada através da propriedade de 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());
Ambas essas propriedades retornam somente a interface associada com esses objetos, não uma referência para objetos ela mesma.Observe que o componente também tem uma propriedade de Container que retorna a mesma interface que Container.Esta propriedade é fornecida por através do site e pode ser considerada como um atalho.
Se você atribuir um nome ao seu componente que usa o método de Add , o nome pode ser recuperado através da propriedade de Name .Se o contêiner tem um objeto de serviço associado a ele, uma referência ao objeto pode ser obtido pelo componente através do método de GetService .
Acessando serviços
Você pode acessar uma variedade de serviços com o método de GetService .Esses serviços fornecem suporte extenso para integrar seus componentes no ambiente de design.Para obter mais informações, consulte Como: acessar serviços de tempo de Design e Arquitetura de tempo de design.
Consulte também
Tarefas
Como: crie contêiner componentes
Como: estender contêiner componentes
Como: acessar serviços de tempo de Design