Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Проверка контекста объекта

Проверка контекста объекта

Из тех приложений, которые вы построите сами, очень немногие могут потребовать программного взаимодействия с контекстом, но вот вам пример для иллюстрации подхода, о котором идет речь. Создайте новое консольное приложение с именем ContextManipulator. Это приложение будет определить один контекстно-независимый класс (SportsCar) и один контекстно-связанный (SportsCarTS).

using System.Runtime.Remoting.Contexts; // Для типа Context.
using System.Threading; // Для типа Thread.
// Тип SportsCar не имеет специальных контекстных требований
// и будет загружен в рамках контекста, создаваемого доменом
// приложения по умолчанию.
public class SportsCar {
 public SportsCar() {
  // Чтение информации и вывод идентификатора контекста.
  Context ctx = Thread.CurrentContext;
  Console.WriteLine("{0} объект в контексте {1}", this.ToString(), ctx.ContextID);
  foreach (IContextProperty itfCtxProp in ctx.ContextProperties) Console.WriteLine("-› Свойство контекста: {0}", itfCtxProp.Name);
 }
}
// Тип SportsCarTS требует загрузки
// в синхронизированном контексте.
[Synchronization]
public class SportsCarTS: ContextBoundObject {
 public SportsCarTS() {
  // Чтение информации и вывод идентификатора контекста.
  Context ctx = Thread.CurrentContext;
  Console.WriteLine("{0} объект в контексте {1}", this.ToString(), ctx.ContextID);
  foreach(IContextProperty itfCtxProp in ctx.ContextProperties) Console.WriteLine("-› Свойство контекста: {0}", itfCtxProp.Name);
 }
}

Обратите внимание на то. что каждый конструктор получает тип Context от текущего потока выполнения через статическое свойство Thread.CurrentContext. Используя объект Context, вы можете распечатать информацию о границах контекста, например, значение ID контекста или значения дескрипторов, полученных через Context.ContextProperties. Это свойство возвращает объект, реализующий интерфейс IContextProperty, который обеспечивает доступ к дескрипторам с помощью свойства Name. Теперь обновите метод Main(), чтобы разместить по экземпляру каждого из типов класса.

static void Main(string[] args) {
 Console.WriteLine("*** Чудесное контекстное приложение ***n");
  // При создании объекты будут отображать информацию контекста.
 SportsCar sport = new SportsCar();
 Console.WriteLine();
 SportsCar sport2 = new SportsCar();
 Console.WriteLine();
 SportsCarTS synchroSport = new SportsCarTS();
 Console.ReadLine();
}

По мере создания объектов конструкторы классов отображают различные элементы информации о контексте (рис. 13.10).


Рис. 13.10. Исследование контекста объекта

Для класса SportsCar не был указан атрибут контекста, поэтому среда CLR размещает sport и sport2 в контексте 0 (т.е. в контексте, созданном по умолчанию). Однако объект SportsCarTS загружается в свои уникальные контекстуальные границы (которым назначается идентификатор 1), поскольку для этого контекстно-связанного типа был указан атрибут [Synchronization].

Исходный код. Проект ContextManipulator размещен в подкаталоге, соответствующем главе 13.

Оглавление книги


Генерация: 1.203. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз