Поделиться через


Связь между контейнерами и компонентами

Контейнер — это связующее звено между клиентским приложением и компонентами, содержащимися в этом контейнере. Приложение может получить ссылки на компоненты, содержащиеся в контейнере, не зная настоящего имени и удостоверения этого компонента. Контейнеры также позволяют компонентам взаимодействовать разнообразными способами с клиентскими приложениями.

Доступ к компонентам, содержащимся в контейнере, можно получить с помощью свойства Components этого контейнера. Это индексированное свойство возвращает объект IComponent, являющийся объектной ссылкой. Для отслеживания компонентов используется принцип "первым поступил — первым обслужен" (first-in, first-out, FIFO). К компонентам можно обратиться по индексу с помощью следующего синтаксиса:

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

Компоненты могут быть добавлены в контейнер как с именем, так и без него. Если имя компонента известно, то для обращения к данному компоненту через контейнер можно использовать это имя, как показано в следующем примере:

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

Обратите внимание, что свойство Components возвращает ссылку на интерфейс IComponent, поэтому через него нельзя обратиться к методам и свойствам компонента, не реализованным в этом интерфейсе.

Основное средство связи между компонентом и контейнером — свойство Site. Через свойство Site компонент может получить ссылку на интерфейс IContainer, реализованный контейнером, как показано ниже:

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

Эту же ссылку можно получить через свойство Container. Подобный способ можно рассматривать как упрощение синтаксиса: ссылка все равно предоставляется через объект ISite, только в данном случае это осуществляется неявно.

Компонент может также получить службы (если они имеются) из контейнера с помощью метода IServiceProvider.GetService Method. Этот метод возвращает объект указанного типа, как показано ниже:

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;

Чтобы объект мог быть получен методом GetService, он должен быть реализован в производном классе-контейнере. Метод GetService класса Container нужно переопределить и написать код, в котором будет реализован объект службы.

См. также

Задачи

Практическое руководство. Создание контейнеров компонентов

Практическое руководство. Усовершенствование контейнеров компонентов

Основные понятия

Контейнеры, веб-узлы и компоненты