Шрифт:
Выше, при обсуждении свойств событийного класса упоминалось, что свойству MuitiInterfacePubiisherFilterCLSID можно программным путем присвоить CLSID некоторого класса, который будет рассматриваться подсистемой событий как фильтр, который на стороне издателя будет перехватывать рассылку уведомлений подписчикам.
При использовании данного подхода (а есть еще один, не обеспечивающий работу с асинхронными событийным классом и подписчиками и здесь не рассматриваемый) издательский фильтр должен реализовывать интерфейс IMultiInterfacePublisherFilter с двумя методами:
• Initialize
Когда издатель инициирует активацию экземпляра событийного класса, подсистема событий автоматически активирует издательский фильтр (если свойство MuitiInterfacePublisherFilterCLSID было задано). В случае какой-либо ошибки при активации фильтра не будет активирован и событийный объект. После активации фильтра подсистема событий сразу же вызывает метод initialize, которому в качестве единственного параметра (входного) передается указатель на реализованный в системе интерфейс IMuitiInterfaceEventControl. Через этот интерфейс фильтр может получить доступ к коллекции подписчиков на произвольный событийный интерфейс и метод в событийном классе, для которого и подготовлен данный фильтр. Достаточно вызвать метод IMuitiInterfaceEventControi::GetSubscriptions, среди параметров которого:
? [in] Идентификатор событийного интерфейса.
? [in] Метод событийного интерфейса. Если название метода не существенно, то значение параметра NULL,
? [in] Критерий отбора объектов-подписок для включения в коллекцию подписок. Здесь задается BSTR сторка, представляющая логическое выражение, в которое входят свойства подписки, операторы отношения, константы, логические операторы и скобки. Если параметр равен NULL, то используется некоторый критерий отбора по умолчанию,
? [out] Указатель на IEventObjectCollection. Через этот интерфейс фильтр получает доступ к коллекции отобранных объектов-подписок и может в дальнейшем определять порядок их оповещения.
Заметим, что построенная при вызове IMuitiInterfaceEventControl::GetSubscriptions коллекция автоматически обновляется при добавлении/удалении подписок на данный событийный интерфейс (метод) в подсистеме событий.
• PrepareToFire
Данный метод собственно и осуществляет перехват процесса рассылки уведомлений. Как только издатель вызывает некоторый метод событийного интерфейса, инициируя тем самым рассылку уведомлений подписчикам, подсистема событий вместо обычного процесса рассылки уведомлений всем подписчикам в некотором заранее неопределенном порядке, вызывает метод PrepareToFire, предоставляя фильтру возможность определить кому и в каком порядке следует послать уведомление. Отбор подписчиков проводится из коллекции подписок, построенной при инициализации фильтра. Вот параметры этого метода:
? [in] Идентификатор событийного интерфейса
? [in] Метод событийного интерфейса
Эти два параметра определяют тип события, рассылку уведомлений о котором инициирует издатель,
? [out] Указатель на интерфейс IFiringControl
Это интерфейс реализован в системе. Фильтр использует его для вызова метода IFiringControl::FireSubscription. Этот метод принимает В качестве единственного (входного) параметра указатель на интерфейс IEventSubscription объекта-подписки, которому следует отправить уведомление о событии. Именно здесь фильтр может определить подписчиков и порядок рассылки им уведомлений.
Фильтр на стороне подписчика
Владелец подписки также может быть заинтересован в фильтрации приходящих уведомлений. Например, его могут интересовать только уведомления о том, когда стоимость акций конкретной компании достигла заданного уровня. Он не хотел бы получать все уведомления о курсе акций всех компаний на рынке или даже о колебаниях курса акций интересующей его компании, пока этот курс не достиг заданной величины.
Среди свойств объекта-подписки имеется свойство FilterCriteria. Это свойство администратор может задавать при регистрации подписки с помощью Component Services. Критерий фильтрации задается логическим выражением, содержащим параметры событийного метода, операторы отношений, константы, логические операторы и скобки. Таким образом, задав критерий фильтрации, администратор устанавливает так называемое параметрическую фильтрацию, результат которой определяется значениями параметров вызываемого метода событийного интерфейса. Данная фильтрация выполняется естественно после фильтрации, выполненной на стороне издателя. В связи с тем, что критерий параметрической фильтрации хранится в подписке на той же машине, где зарегистрирован событийный класс, никакие излишние вызовы на машину, где обычно активируется подписчик, не выполняются. Естественно, и сам подписчик активируется если только направляемое ему уведомление преодолело параметрический фильтр.
.NET Framework от Microsoft
Введение
NET во многом революционизирует программирование под Windows. Это большая и сложная технология, которая требует от разработчиков глубоких знаний во многих областях, связанных с распределенным программированием распределенных систем.
Остановимся прежде всего на некоторых вопросах, касающихся тенденций развития программирования за последние десятилетия. Почти до самого конца 20 века все наиболее распространенные технологии программирования ориентировались на вычислительные машины, разработка архитектуры которых приписывается американскому математику фон Нейману. Этот период можно охарактеризовать как централизованное программирование централизованных систем. Иными словами, программирование системы контролируется из одного центра и сама разрабатываемая система имеет централизованное управление.