Этим мы завершаем обсуждение транзакций COM+ и класса ContextUtil
. Давайте перейдем к пулам объектов.
Использование пудов объектов со сборками .NET
Нетрудно сконфигурировать компонент .NET для пула объектов. Для этого необходимо изменить класс с помощью атрибута и реализовать интерфейс в этом классе.
Атрибут ObjectPooling
Атрибутом с помощью которого необходимо изменить класс, является ObjectPooling
. Этот атрибут получает четыре аргумента.
1. Enabled
яв
2. Аргумент MinPoolSize
определяет минимальное число экземпляров объектов, которое должны поддерживать службы COM+ в пуле объектов класса.
3. Аргумент MaxPoolSize
определяет максимальное число экземпляров объектов, которое должны поддерживать службы COM+ в пуле объектов класса.
4. Аргумент CreationTimeOut
определяет период времени, в течение которого службы COM+ должны пытаться получить объект из пула, прежде чем вернуть отказ.
Далее следует пример атрибута ObjectPooling
со всеми четырьмя аргументами, примененными к классу. Мы расширим этот фрагмент кода в конце данного раздела.
[ObjectPooling (Enabled=True, MinPoolSize=1, MaxPoolSize=100, CreationTimeout=30)]
public class CreditCard:ServicedComponent {
Интерфейс ServicedComponent
Как можно было заметить, класс в примере выше наследует интерфейс ServicedComponent
. Все классы .NET, которые используют пулы объектов, должны реализовывать этот интерфейс. ServicedComponent
содержит три метода для переопределения.
1. Метод CanBePooled()
используется клиентами для определения, что может быть создан пул объектов класса.
2. Метод Activate()
вызывается службами COM+ на объекте в пуле перед тем, как этот объект передается новому клиенту.
3. Метод Deactivate()
, напарник метода Activate()
, вызывается службами COM+, когда объект освобождается клиентом, чтобы вернуть его в пул доступных объектов.
Следующий фрагмент кода показывает класс, сконфигурированный для пула объектов.
[ObjectPooling (Enabled=true, MinPoolSize=1, MaxPoolSize=100, CreationTimeout=30)]
public class CreditCard:ServicedComponent {
// Этот метод будет вызываться службами COM+ для определения,
// что объект находится в пуле.
public override bool CanBePooled() {
return true; // необходимо вернуть логическое 'true'
}
// Этот метод должен вызываться службами COM+, когда объект
// передается клиенту.
public override void Activate() {
// Код инициализации находится здесь.
}
// Этот метод будет вызываться службами COM+, когда
// объект будет возвращаться в пул.
public override void Deactivate() {
// Код завершения находится здесь
}
// Этот метод будет вызываться клиентом.
public void PlaceCharge(int OrderInfo, int UserInfo) {
// код списания средств с кредитной карты находится здесь
}
}
Как показывает пример, атрибут ObjectPooling
и интерфейс ServicedComponent
требуются для того, чтобы класс .NET реализовал пул объектов. Также можно заметить, что в отличие от атрибута Transaction
атрибут ObjectPooling
применяется непосредственно к 'рабочей' сборке .NET, а не к классу прокси, созданному с атрибутом ComEmulate
, который был рассмотрен ранее в этой главе.
Использование активизации JIT со сборками .NET
Чтобы сконфигурировать класс .NET для активизации JIT, нужно просто изменить класс с помощью атрибута JustInTimeActivation
, задав булево значение true. В данном случае класс CreditCard
из предыдущего примера модифицируется для активизации JIT.
[JustInTimeActivation(true)]
public class CreditCard: ServicedComponent {
// Этот метод будет вызываться клиентом.
public void PlaceCharge(OrderInfo objOrderInfo, UserInfo objUserInfo) {
// Код для снятия средств с кредитной карты находится здесь
}
}
Заключение