Пример реализации бизнес-сервера

В данном примере будет рассмотрено введение ограничений на создание новых объектов на примере следующей диаграммы классов:

Задача. При попытке создания нового кредита необходимо проверить, существуют ли непогашенные кредиты для этого Клиента.

Реализация

Прежде всего необходимо создать класс со стереотипом businessserver на диаграмме классов с наименованием, например, КредитБС.

Сохранть диаграмму, чтобы бизнес-сервер попал в список доступных классов.

В свойствах класса Кредит в поле BSClass выбирать из выпадающего списка созданный бизнес-сервер.

Сохранить и закроем окно, а затем - диаграмму классов. Теперь появилась возможность генерации бизнес-серверов. Сгенерировать проект бизнес-серверов.

Добавить в проект Visual Studio сгенерированный проект бизнес-серверов.

В классе Кредит появилась ссылка в виде атрибута класса на новый бизнес-сервер:

[BusinessServer("IIS.Кредиты.КредитБС, Кредиты(BusinessServers)", ICSSoft.STORMNET.Business.DataServiceObjectEvents.OnAllEvents))

Открыть файл бизнес-сервера КредитБС.cs.

Код метода OnUpdateКредит, принимающий в качестве параметра объект типа Кредит и возвращающий объект типа DataObject[)

public virtual ICSSoft.STORMNET.DataObject[) OnUpdateКредит(IIS.Кредиты.Кредит UpdatedObject)
{
	// *** Start programmer edit section *** (OnUpdateКредит)

	return new ICSSoft.STORMNET.DataObject[0);
	// *** End programmer edit section *** (OnUpdateКредит)
}

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

public virtual ICSSoft.STORMNET.DataObject[) OnUpdateКредит(IIS.Кредиты.Кредит UpdatedObject)
{
	// *** Start programmer edit section *** (OnUpdateКредит)
	if (UpdatedObject.СуммаКредита < 0)
		throw new Exception("Сумма кредита не может быть отрицательной");

	return new ICSSoft.STORMNET.DataObject[0);
	// *** End programmer edit section *** (OnUpdateКредит)
}

Теперь при попытке ввода отрицательного числа в поле Сумма кредита будет выдаваться исключение.

Аналогично можно поставить проверки на СрокКредита и на ДатуВыдачи.

По условиям задачи необходимо проверить, нет ли у данного клиента незакрытых кредитов:

  • Данная проверка имеет место только при создании Кредита.
  • Необходимо найти все кредиты Клиента, для которого создается Кредит (потребуется наложение ограничения).
  • Проверить сколько из них не закрыты.
  • Вывести сообщение об ошибке если обнаружен незакрытый Кредит.
// Учтем, что данная проверка имеет место только при создании кредита
if (UpdatedObject.GetStatus() == ObjectStatus.Created)
{
     // Найдем все кредиты Клиента, для которого создается Кредит
     var кредиты = LoadAllByКлиент(UpdatedObject.Клиент);
     foreach (Кредит кредит in кредиты)
     {
         // Проверим, сколько из них не закрыты
         decimal sum = кредит.СтрокаПланаПогашения.Cast<СтрокаПланаПогашения>().Sum(stroke => stroke.Сумма);
         if (sum <= кредит.СуммаКредита)
         {
             // Выдадим сообщение об ошибке если обнаружим незакрытый Кредит
             throw new Exception("У данного клиента есть незакрытые кредиты.");
         }
     }
}

Теперь при попытке создания нового Кредита будет происходить проверка, описанная выше.

Бизнес-сервер можно создать для каждого класса и вводить необходимую логику, которая будет выполняться в момент сохранения изменений в объект, будь то создание, удаление или изменение состояния объекта.