Отработка пользовательских операций в процессе работы сервиса данных

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

Итак, чтобы организовать эту обработку, необходимо:

  • Описать класс — бизнес-сервер, наследник от 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 Журнал : Ресурс
{
		/*Что-то*/
}

Другие примеры

Особенности функционирования

Сервис данных вызовет метод-перехватчик непосредственно перед выполнением соответствующей операции. Параметром методу придёт объект данных, над которым выполняется операция. Метод может вернуть какие-либо дополнительные объекты данных, которые будут «подхвачены» сервисом данных.

Нужно возвращать объекты данных, а не выполнять отдельные вызовы сервиса данных прямо изнутри перехватчика, чтобы обновление добавленных объектов выполнилось в той же транзакции. Иначе, отдельный вызов сервиса данных — отдельная транзакция, соответственно, если код выполняется не под сервером транзакций (напр. COM+), будет разрыв.