Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лр1_Удаленное взаимодействие.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
701 Кб
Скачать
☆

Избранные члены типа ChannelServices

В дополнение к методам RegisterChannel() и UnregisterChannel() с их ясными названиями, тип ChannelServices определяет свойство RegisteredChannels. Этот член возвращает массив интерфейсов IChannel, каждый из которых представляет дескриминатор соответствующего канала из тех, которые зарегистрированы в данном домене приложений.

Определение интерфейса IChannel достаточно простое:

public interface IChannel

{

string ChannelName { get; }

int ChannelPriority { get; }

string Parse(string url, ref String objectURI);

}

Каждый канал получает понятное строковое имя вместе с уровнем своего приоритета. Например, если добавить в метод Main() приложения SimpleRemoteObjectClient следующую программную логику:

// Список всех зарегистрированных каналов channels.

IChannel[] channelObjs = ChannelServices.RegisteredChannels;

foreach(IChannel i in channelObjs)

{

Console.WriteLine("Channel name: {0}", i.ChannelName);

Console.WriteLine("Channel Priority: {0}", i.ChannelPriority);

},

то на консоли клиентской стороны можно будет увидеть то, что показано на рис. 1.4.

Рис. 2. Перечисление каналов клиентской стороны

1.4. Основные механизмы удаленного взаимодействия

Как и любая новая парадигма, технология удаленного взаимодействия .NET привнесла с собой ряд трехбуквенных аббревиатур. Определить несколько терминов, используемых при описании композиции приложений, использующих эту технологию. Эта терминология используется для описания деталей, касающихся общих вопросов конструирования распределенных приложений. Например, как передать тип объекта через границы домена приложения? Когда именно активизируется удаленный объект? Как управлять жизненным циклом удаленного объекта (и т.д.)? После усвоения соответствующей терминологии процесс построения распределенного приложения .NET станет намного проще.

1.4.1. Способы представления удаленных объектов

Платформа .NET предоставляет два варианта того, как предоставить удаленный объект клиенту. В основе каждого из них используется понятие маршалинга. Маршализация (marshaling) описывает способ передачи удаленного объекта между доменами приложений. При проектировании удаленного объекта можно выбирать между семантикой маршализации по ссылке (marshal-by-reference — MBR) и маршализации по значению (marshal-by-value — MBV). Разница состоит в следующем:

  • объекты MBR — вызывающий код получает прокси к удаленному объекту. Другими словами вызывающий объект получает в свое распоряжение локального представителя (заместителя) удаленного объекта;

  • объекты MBV — вызывающий код получает копию объекта в своем собственном домене приложения. Это означает создание локальной копии удаленного объект в адресном пространстве вызывающего объекта.

При конфигурировании типа объекта MBR среда CLR обеспечивает создание прозрачного и реального прокси в домене приложения клиента, в то время как сам объект MBR остается в домене приложения сервера. Когда клиент вызывает методы удаленного типа, механизм удаленного взаимодействия .NET берет дело в свои руки и пакует, передает и возвращает информацию через границы доменов приложений. Объекты MBR имеют множество особенностей, помимо их физического расположения. Например, объекты MBR имеют различные настройки конфигурации, касающиеся опций активизации и управления жизненным циклом.

Объекты MBV, с другой стороны, являются локальными копиями удаленных объектов. Объекты MBV имеют намного меньше настроек конфигурации, учитывая, что их время жизни напрямую контролируется клиентом. Подобно любому объекту .NET, как только клиент освобождает все ссылки на тип MBV, он становится кандидатом на сборку мусора.

Учитывая, что типы MBV являются локальными копиями удаленных объектов, и клиент вызывает члены объекта этого типа в своем адресном пространстве, то никакой сетевой активности это уже не требует. Однако, довольно часто один сервер может представлять доступ к множеству типов MBR и MBV. И как можно было бы ожидать, типы MBR имеют тенденцию поддерживать методы, возвращающие различные типы MBV, что дает возможность узнать шаблон фабрики классов (т.е. объект, который создает и возвращает другие связанные с ним удаленные объекты). Каким же образом в таких случаях конфигурировать пользовательские типы классов как сущности MBR или MBV?