Мы рассмотрим каждую из указанных возможностей в следующих разделах, а пока что давайте рассмотрим установки лизинга, принятые для удаленного типа по умолчанию. Вспомните, что базовый класс MarshalByRefObject определяет член с именем GetLifetimeService(). Этот метод возвращает ссылку на внутренний объект, поддерживающий интерфейс System.Runtime.Remoting.Lifetime.ILease. Интерфейс ILease можно использовать для управления параметрами лизинга данного САО-типа или WKO-синглета. Вот формальное определение этого интерфейса.
public interface ILease {
TimeSpan CurrentLeaseTime { get; }
LeaseState CurrentState { get; }
TimeSpan InitialLeaseTime { get; set; }
TimeSpan RenewOnCallTime { get; set; }
TimeSpan SponsorshipTimeout { get; set; }
void Register(System.Runtime.Remoting.Lifetime.ISponsor obj);
void Register(System.Runtime.Remoting.Lifetime.ISponsor obj, TimeSpan renewalTime);
TimeSpan Renew(TimeSpan renewalTime);
void Unregister(System.Runtime.Remoting.Lifetime.ISponsor obj);
}
Интерфейс ILease не только позволяет получить информацию о текущих параметрах лизинга (с помощью CurrentLeaseTime, CurrentState и InitialLeaseTime), но и обеспечивает возможность построения "спонсоров" лизинга (более подробно об этом будет говориться позже). Роль каждого из членов ILease описана в табл. 18.6.
Таблица 18.6. Члены интерфейса ILease
| Член | Описание |
|---|---|
| CurrentLeaseTime | Читает информацию о времени, оставшемся до отключения данного объекта при отсутствии новых вызовов методов объекта |
| CurrentState | Читает информацию о текущем состоянии лизинга, представленную значением перечня LeaseState |
| InitialLeaseTime | Читает или устанавливает исходное время лизинга. Исходное время лизинга – это время от начала активизации объекта до истечения лизинга при отсутствии новых вызовов методов объекта |
| RenewOnCallTime | Читает или устанавливает значение времени, на которое вызов удаленного объекта увеличивает значение CurrentLeaseTime |
| SponsorshipTimeout | Читает или устанавливает значение времени ожидания спонсора для возвращения времени возобновления лизинга |
| Register() | Перегруженный метод, регистрирующий спонсора данного лизинга |
| Renew() | Возобновляет лизинг с указанным временем |
| Unregister() | Удаляет указанный спонсор из списка спонсоров |
Для иллюстрации особенностей лизинга по умолчанию для удаленных СAО-типов и WKO-синглетов определим в нашем текущем проекте CAOCarGeneralAsm новый внутренний класс LeaseInfo. Статический член LeaseStats() этого класса выводит информацию о текущем лизинге для типа CarProvider в окно консоли сервера (не забудьте указать директиву using для пространства имен System.Runtime.Remoting.Lifetime, чтобы сообщить компилятору о месте нахождения определении типа ILease).
internal class LeaseInfo {
public static void LeaseStats(ILease itfLease) {
Console.WriteLine(***** Информация о лизинге *****");
Console.WriteLine("Состояние лизинга: {0}", itfLease.CurrentState);
Console.WriteLine("Начальное время лизинга: {0}:{1}", itfLease.InitialLeaseTime.Minutes, itfLease.InitialLeaseTime.Seconds);
Console.WriteLine("Текущее время лизинга: {0}:{1}", itfLease.CurrentLeaseTime.Minutes, itfLease.CurrentLeaseTime.Seconds);