Поделиться через


Активация контекста

В COM+каждый COM-объект создается с соответствующим контекстом. Это означает, что необходимо создать и инициализировать новый контекст или использовать соответствующий существующий контекст. Этот процесс называется активацией. В COM+объект активируется либо в собственном контексте, либо в его создателе (объект, запрашивающий активацию объекта, например путем вызова CoCreateInstance).

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

Базовый механизм является одинаковым в любом случае — объект связан с контекстом, и этот контекст правильно инициализирован для представления потребностей во время выполнения объекта.

Поток свойств контекста

Когда объект активируется в ответ на запрос на создание другого объекта, COM+ должен посредник между ними должным образом активировать подчиненный объект. COM+ должен сравнить контекст вызывающего объекта с конфигурацией вызываемого компонента, а затем решить, где активировать подчиненный компонент и как инициализировать его свойства контекста.

Чтобы обнаружить конфигурацию компонента, COM+ ищет его в базе данных регистрации класса COM+, оптимизированной для очень быстрых подстановок во время выполнения. (Это определяется тем, как вы настроили компонент при установке в приложение COM+.) Затем конфигурация компонента проверяется в отношении состояния свойств контекста вызывающего объекта.

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

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

Игнорируемые свойства контекста

В зависимости от того, как настроен компонент, некоторые свойства контекста могут не играть никакой роли в определении того, активируется ли он в контексте создателя или в собственном контексте. Например, параметры отключенных транзакций и синхронизации, указывающие на наличие транзакции или домена синхронизации, не будут играть никакой роли в активации компонента. Эти свойства в основном игнорируются при потоке контекста. Или если компонент использует только доступ на уровне процесса проверка, его свойство контекста безопасности игнорируется, конфигурация безопасности компонента никогда не будет играть роль в активации.

Принудительное активация в контексте вызывающего объекта

В некоторых случаях может потребоваться активировать объект только в контексте вызывающего объекта, т. е. никогда не активируется в собственном контексте. Например, может потребоваться управлять поведением объекта при вызове через границу контекста.

Вы можете убедиться, что объект не может быть активирован в собственном контексте, выбрав параметр "Необходимо активировать в контексте вызывающих абонентов" на вкладке "Активация" страницы свойств компонента с помощью средства администрирования служб компонентов. (См. раздел Принудительное применение активации в контексте вызывающего объекта для пошаговые инструкции.) При выборе этого параметра, если объект не может быть активирован в контексте вызывающего объекта, метод CoCreateInstance завершается ошибкой, возвращая CO_E_ATTEMPT_TO_CREATE_OUTSIDE_CLIENT_CONTEXT.

Контекст по умолчанию

Контексты по умолчанию существуют для поддержки ненастроенных компонентов, то есть com-компоненты, не установленные в приложениях COM+ и не зарегистрированные в базе данных регистрации классов COM+. Если у ненастроенных компонентов есть совместимая модель потоковой обработки, они активируются в контексте вызывающего объекта. В противном случае они активируются в контексте по умолчанию в соответствующей квартире. Каждая квартира имеет контекст по умолчанию для поддержки COM-объектов, которые не используют службы COM+.

Активация перехватчика

Реализуя IObjectControl::Activate и IObjectControl::D eactivate, вы можете подключить активацию и деактивацию вместе, чтобы выполнить специальную инициализацию в новом контексте. Эти методы вызываются COM+ в определенных точках жизненного цикла объекта, когда объект настроен для использования JIT-активации или пула объектов. Дополнительные сведения см. в разделе COM+ JIT-активация и пул объектов COM+.

Перехват меж контекстных вызовов