Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

Атрибуты и свойства

Класс атрибута контекста является прежде всего атрибутом. Более подробно можно прочитать об этом в главе 6. Классы атрибутов контекста должны реализовать интерфейс

IContextAttribute
. Специальный класс атрибута контекста можно вывести из класса
ContextAttribute
, так как этот класс уже имеет используемую по умолчанию реализацию данного интерфейса.

В .NET Framework содержатся два класса атрибутов контекста:

System.Runtime.Remoting.Contexts.SynchronizationAttribute
и
System.Runtime.Remoting.Contexts.ThreadAffinityAttribute
.
С помощью атрибута
ThreadAffinity
можно задать, что только один поток выполнения получает доступ к полям экземпляра и методам ограниченного контекстом класса. Это полезно для объектов интерфейса пользователя, так как дескрипторы окон определяются относительно потока выполнения. Атрибут
Synchronization
, с другой стороны, определяет требования синхронизации. Здесь можно задать, что несколько потоков выполнения не вправе получить доступ к объекту одновременно, но поток выполнения, получающий доступ к объекту, может меняться.

С помощью этих атрибутов в конструкторе задаются четыре значения:

□ 

NOT_SUPPORTED
определяет, что экземпляр класса не должен создаваться в контексте, который имеет либо сходство с потоком выполнения, либо с множеством синхронизации.

REQUIRED
устанавливает, что требуется контекст со сходством с потоком выполнения/синхронизацией.

REQUIRES_NEW
всегда обеспечивает получение нового контекста.

SUPPORTED
означает, что независимо от того, какой контекст мы получаем, объект сможет в нем существовать.

Коммуникация между контекстами

Как же происходит коммуникация между контекстами? Клиент использует вместо реального объекта прокси. Оно создает сообщение, которое передается в канал, и приемники могут выполнить перехват. Тот же самый механизм используется для коммуникации между различными доменами приложения или различными системами. Канал TCP или HTTP не требуется для коммуникации между контекстами, но канал здесь, конечно же, есть. Класс

CrossContextChannel
может использовать одну и ту же виртуальную память на клиентской и на серверной стороне канала, при этом для соединения контекстов не требуются форматтеры.

Удаленные объекты, клиенты и серверы

Прежде чем перейти к рассмотрению деталей архитектуры .NET Remoting, давайте рассмотрим кратко удаленный объект и очень маленькое простое клиентское серверное приложение, которое использует этот удаленный объект. Затем мы обсудим более подробно все необходимые шаги и параметры.

Реализуемый удаленный объект называется

Hello
.
HelloServer
является основным классом приложения на сервере, a
HelloClient
предназначен для клиента:

Удаленные объекты

Удаленные объекты требуются для распределенного вычисления. Объект, вызываемый удаленно с другой системы, выводится из объектов

System.MarshalByRefObject.MarshalByRefObject
и соответствует домену приложения, в котором они создаются. Это означает, что такие объекты никогда не переходят между доменами приложений; вместо этого используется объект прокси для доступа к удаленному объекту изнутри другого домена приложения. Другой домен приложения может существовать внутри того же процесса, другого процесса, или на
другой системе.

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

Класс

MarshalByRefObject
имеет в дополнение к унаследованным методам из класса
Object
методы для инициализации и получения служб времени жизни. Службы времени жизни определяют, как долго живут удаленные объекты. Службы времени жизни и арендуемые свойства будут рассмотрены позже в этой главе.

Чтобы увидеть .NET Remoting в действии, создается простая библиотека классов для удаленного объекта. Класс

Hello
выводится из
System.MarshalByRefObject
. В конструкторе и деструкторе на консоли записывается сообщение, чтобы было известно о времени жизни объекта. Кроме того, имеется только один метод
Greeting
, который будет вызываться от клиента.

Для того чтобы легко различать в последующих разделах сборку и класс, дадим им различные имена аргументов, которые используют вызовы метода. Присвоим сборке имя

RemoteHello.dll
, а классу —
Hello
. Типом проекта Visual Studio.NET, используемым для этого класса, является Visual C# Class Library:

namespace Wrox.ProfessionalCSharp {

 using System;

 /// <summary>

 /// Краткое описание Class1

 /// </summary>

 public class Hello: System.MarshalByRefObject {

public Hello {

Console.WriteLine("Constructor called");

}

~Hello {

Console.WriteLine("Destructor called");

}

public string Greeting(string name) {

Console.WriteLine("Greeting called");

return "Hello, " + name;

}

 }

}

Простой сервер

Для сервера используется консольное приложение C#. Для применения класса

TcpServerChannel
необходимо сослаться на сборку
System.Runtime.Remoting.dll
. Также требуется, чтобы мы ссылались на созданную ранее сборку
RemoteHello.dll
.

В методе

Main
создается объект
System.Runtime.Remoting.Channel.Тcр.TcpServerChannel
с портом номер 8086. Этот канал регистрируется в классе
System.Runtime.Remoting.Channels.ChannelServices
, чтобы сделать его доступным для удаленных объектов. Тип удаленного объекта регистрируется с помощью
System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType
. Здесь определяется тип класса в удаленном объекте, используемый клиентом URI, и режим. Режим
WellKnownObject.SingleCall
означает, что для каждого вызова метода создается новый экземпляр, мы не храним состояние в удаленном объекте.

Поделиться:
Популярные книги

Ну, здравствуй, перестройка!

Иванов Дмитрий
4. Девяностые
Фантастика:
попаданцы
альтернативная история
6.83
рейтинг книги
Ну, здравствуй, перестройка!

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Ученик. Книга вторая

Первухин Андрей Евгеньевич
2. Ученик
Фантастика:
фэнтези
5.40
рейтинг книги
Ученик. Книга вторая

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Плохая невеста

Шторм Елена
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Плохая невеста

Законы Рода. Том 3

Flow Ascold
3. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 3

Измена. Ты меня не найдешь

Леманн Анастасия
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Ты меня не найдешь

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Убивать чтобы жить 8

Бор Жорж
8. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 8

Мужчина моей судьбы

Ардова Алиса
2. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.03
рейтинг книги
Мужчина моей судьбы

Николай I Освободитель. Книга 5

Савинков Андрей Николаевич
5. Николай I
Фантастика:
альтернативная история
5.00
рейтинг книги
Николай I Освободитель. Книга 5

Шведский стол

Ланцов Михаил Алексеевич
3. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Шведский стол