Если необходимо выполнить какие-либо действия в процессе обновления сервисом данных хранилища, можно организовать обработку событий сервиса данных через специализированный бизнес-сервер.
Итак, чтобы организовать эту обработку, необходимо:
- Описать класс — бизнес-сервер, наследник от
ICSSoft.STORMNET.Business.BusinessServer
. - Описать метод-перехватчик вида
public DataObject[] OnUpdateXXXXX(XXXXX UpdatedObject)
где XXXXX — имя класса данных, чьи экземпляры обновляет сервис данных. Имплементировать этот метод (выполнить необходимые действия при обновлении).
Указание бизнес-сервера классу данных
Прописать бизнес-сервер нужному классу данных .Net
-атрибутом BusinessServer
, одновременно указывая тип события.
Типы событий бывают следующие:
DataServiceObjectEvents.OnAllEvents
— все события сервиса данных;DataServiceObjectEvents.OnAnyEvent
— любые события сервиса данных (неактуально при приписывании события, актуально при получении бизнес-сервера методомBusinessServerProvider.GetBusinessServer
, можно получить бизнес-сервер без различий относительно типов событий, на которые он был подписан);DataServiceObjectEvents.OnDeleteFromStorage
— объект данных будет удалён сервисом данных;DataServiceObjectEvents.OnInsertToStorage
— объект данных будет создан в хранилище;DataServiceObjectEvents.OnUpdateInStorage
— объект данных будет обновлен в хранилище.
Типы событий можно комбинировать через |
.
Сервис данных вызовет метод-перехватчик непосредственно перед выполнением соответствующей операции. Параметром методу придёт объект данных, над которым выполняется операция. Метод может вернуть какие-либо дополнительные объекты данных, которые будут «подхвачены» сервисом данных.
О том, зачем нужно возвращать объекты данных, а не выполнять отдельные вызовы сервиса данных прямо изнутри перехватчика. Ответ очевиден — для того, чтобы обновление добавленных объектов выполнилось в той же транзакции. Иначе, отдельный вызов сервиса данных — отдельная транзакция, соответственно, если код выполняется не под сервером транзакций (напр. COM+
), будет разрыв.
Программист может узнать, какой бизнес-сервер приписан классу данных через провайдер бизнес-серверов, метод BusinessServerProvider.GetBusinessServer
.
Пример бизнес-сервера и класса данных с приписанным бизнес-сервером
public class DataServiceEventsServer:ICSSoft.STORMNET.Business.BusinessServer
{
public DataObject[] OnUpdateЖурнал(Журнал UpdatedObject)
{
Console.WriteLine("Поймали обновление журнала {0}." , UpdatedObject.Наименование);
return new DataObject[0];
}
}
[BusinessServer(typeof(DataServiceEventsServer), DataServiceObjectEvents.OnInsertToStorage)]
// *** End programmer edit section *** (Журнал CustomAttributes)
public class Журнал : Ресурс
{
/*Что-то*/
}
Другие примеры
- Проверка уникальности введенных данных в бизнес-сервере.
- Пример использования бизнес-сервера.
- Проверка валидности изменений данных объекта в бизнес-сервере
- github.com.
Особенности функционирования
Сервис данных вызовет метод-перехватчик непосредственно перед выполнением соответствующей операции. Параметром методу придёт объект данных, над которым выполняется операция. Метод может вернуть какие-либо дополнительные объекты данных, которые будут «подхвачены» сервисом данных.
Нужно возвращать объекты данных, а не выполнять отдельные вызовы сервиса данных прямо изнутри перехватчика, чтобы обновление добавленных объектов выполнилось в той же транзакции. Иначе, отдельный вызов сервиса данных — отдельная транзакция, соответственно, если код выполняется не под сервером транзакций (напр. COM+
), будет разрыв.