Проверка контекста объекта
Проверка контекста объекта
Из тех приложений, которые вы построите сами, очень немногие могут потребовать программного взаимодействия с контекстом, но вот вам пример для иллюстрации подхода, о котором идет речь. Создайте новое консольное приложение с именем 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("*** Чудесное контекстное приложение *** ");
// При создании объекты будут отображать информацию контекста.
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.