Чтение онлайн

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

 }

 // Поместить код транзакции здесь

}

Вторым полезным методом класса

ContextUtil
является
IsInTransaction
. Этот метод возвращает булево значение, указывающее, участвует ли объект в данный момент в транзакции.

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

IsInTransaction
класса
ContextUtil
и инициировать ошибку, если это свойство задано как
false
.

В примере кода ниже свойство

IsInTransaction
используется для гарантии, что сборка правильно сконфигурирована, прежде чем ей будет разрешено ей начать какую-либо работу. Код порождает исключение, если
IsInTransaction
имеет значение
false
. Можно протестировать это, изменяя атрибут класса на
TransactionalOptionDisabled
.

[AutoComplete]

public bool PlaceOrder(bool CommitTrans) {

 if (!ContextUtil.IsInTransaction) {

throw new

ConfigurationException("This assembly needs to be configured for" + " transactions.");

 }

 // Выполнить транзакцию

}

Этим мы завершаем обсуждение транзакций COM+ и класса

ContextUtil
. Давайте перейдем к пулам объектов.

Использование пудов объектов со сборками .NET

Нетрудно сконфигурировать компонент .NET для пула объектов. Для этого необходимо изменить класс с помощью атрибута и реализовать интерфейс в этом классе.

Атрибут ObjectPooling

Атрибутом с помощью которого необходимо изменить класс, является

ObjectPooling
. Этот атрибут получает четыре аргумента.

1. Аргумент

Enabled
является первым. Ему должно быть присвоено значение true.

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 {

 // Этот метод будет вызываться клиентом.

Поделиться с друзьями: