Recipientes, Sites e componentes

Um recipiente é um objeto de coleção especializados que fornece o confinamento lógico para um ou mais componentes. Recipientes de gerenciar a interação dos componentes uns com os outros, bem como com o ambiente de aplicativo externo, fornecendo uma implementação da ISite interface através da qual podem levar a interações local. O recipiente permite o acompanhamento de seus componentes em uma base first in, First-out e permite que você consulte os componentes em um índice. O recipiente também fornece um meio de alienação comuns de seus componentes quando você não tem mais necessidade para eles.

Confinamento refere-se à contenção de lógica, não visual ou física de confinamento. O recipiente encapsula um ou mais componentes e fornece um wrapper através do qual os clientes podem interagir. O contêiner permite adicionar e remover componentes via a 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 recipiente do componente será uma instância da Container classe ou uma implementação da IContainer interface. Containeré a implementação de referência desta interface.

Especificando um nome de componente

Você também pode especificar um nome para seu componente dentro do contêiner. Esse nome deve ser exclusivo no recipiente e é especificado usando o Add método.

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");

Gerenciamento de recursos e estendendo recipientes

Os contêineres fornecem um meio de central de gerenciamento de recursos associados a seus componentes. Quando o Dispose método é chamado, o recipiente automaticamente chama o Dispose o método de todos os componentes contidos, garantindo assim que os recursos sejam liberados prontamente.

Recipientes são extensíveis. Você pode criar sua própria classe que herda de Container que incorpora a funcionalidade personalizada. Por exemplo, você pode criar um recipiente aplicadas regras que determinam quais componentes podem ser adicionados ao contêiner, como é mostrado 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();
      }
   }
}
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() ;
      }
   }
}   

O exemplo anterior cria uma nova classe de contêiner é capaz de aplicar uma regra sobre quais componentes são capazes de participar do contêiner. Se um componente não é da classe especificada (no caso, Widget), uma exceção é lançada.

Quando um componente é adicionado a um recipiente, o recipiente cria um site para ele. Esta é uma implementação da ISite que é exposto por meio do componente de interface Site propriedade. Comunicação por um componente com seu contêiner de host é realizada por meio do componente Site propriedade. Essa propriedade representa o site lógico do componente e é hospedada pelo contêiner. Um componente que não está contido em um recipiente retorna um null de referência para seu Site propriedade. O Site propriedade permite que você obtenha uma referência para a interface do contêiner por meio de ISite.Container propriedade ou uma referência à interface do componente que está sendo hospedada por meio do Component propriedade.

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

Essas duas propriedades retornam somente a interface associada a esses objetos, e não uma referência a objetos em si. Observe que o componente também possui um Container propriedade que retorna a mesma interface Container. Esta propriedade é fornecida pelo através do site e pode ser considerada como um atalho.

Se você atribuir um nome para seu componente usando o Add método, o nome pode ser recuperado por meio de Name propriedade. Se o contêiner tem um objeto de serviço associado a ele, uma referência a esse objeto pode ser obtida pelo componente via o GetService método.

Acesso a serviços

Você pode acessar uma variedade de serviços por meio de GetService método. Esses serviços fornecem amplo suporte para integrar seus componentes no ambiente de design. Para obter mais informações, consulte Como: Acessar os serviços de tempo de Design e Arquitetura de tempo de design.

Consulte também

Tarefas

Como: Criar recipientes de componente

Como: Estender os recipientes de componente

Como: Acessar os serviços de tempo de Design

Conceitos

Comunicação entre os contêineres e componentes

Arquitetura de tempo de design