Базовые принципы разработки бизнес-сервера

Бизнес-сервер есть набор методов. В UML бизнес-сервер отрисовывается UML-классом с установленным атрибутом «businessserver». Система может содержать произвольное число бизнес-серверов. В общем, число бизнес-серверов и состав их методов определяется прикладным разработчиком.

Бизнес-сервер — класс, непосредственно содержащий код бизнес-операций.

Пример сгенерированного кода бизнес-сервера

Для каждого объекта данных, у которого на UML-диаграмме указан BusinesServer генерируется метод подобно следующему (в данном случае классу Car указан в соответствие бизнес-сервер CarBS):

/// <summary>
/// CarBS.
/// </summary>
// *** Start programmer edit section *** (CarBS CustomAttributes)

// *** End programmer edit section *** (CarBS CustomAttributes)
[ICSSoft.STORMNET.AccessType(ICSSoft.STORMNET.AccessType.none)]
public class CarBS : ICSSoft.STORMNET.Business.BusinessServer
{
        
    // *** Start programmer edit section *** (CarBS CustomMembers)

    // *** End programmer edit section *** (CarBS CustomMembers)

    // *** Start programmer edit section *** (OnUpdateCar CustomAttributes)

    // *** End programmer edit section *** (OnUpdateCar CustomAttributes)
    public virtual ICSSoft.STORMNET.DataObject[] OnUpdateCar(NewPlatform.Flexberry.ORM.ODataService.Tests.Car UpdatedObject)
    {
        // *** Start programmer edit section *** (OnUpdateCar)
        var dObjs = new List<DataObject>();

        if (UpdatedObject.GetStatus() == ICSSoft.STORMNET.ObjectStatus.Created)
        {
            UpdatedObject.Driver.CarCount++;

            UpdatedObject.Number =
                string.Format("{0}/{1}",
                    "TECT",
                    UpdatedObject.Driver.CarCount);

            dObjs.Add(UpdatedObject.Driver);
        }

        // Чтобы попасть в одну транзакцию объекты должны быть возвращены.
        return dObjs.ToArray();
        // *** End programmer edit section *** (OnUpdateCar)
    }
}

Правила разработки бизнес-серверов

Класс бизнес-сервера наследуется от ICSSoft.STORMNET.Business.BusinessServer, который содержит свойства:

  • DataService - сервис данных, на котором сработает этот бизнес-сервер.
  • ObjectsToUpdate - “соседние” обновляемые объекты данной транзакции.
  • Order - Упорядочение бизнес-серверов. 0 - выполнится раньше остальных, int.MaxValue выполнится последним. По-умолчанию: 0.

Допустим, выполняется операция обновления данных следующим образом:

DataObject[] objectsCars = new DataObject[] { car1, car2 };
ds.UpdateObjects(ref objectsCars);

Показанный в примере метод OnUpdateCar будет вызван последовательно для объектов car1 и car2. Через свойство ObjectsToUpdate можно получить доступ к массиву objectsCars, переданному в метод UpdateObjects сервиса данных. Это может быть полезным, если логика бизнес-сервера зависит от “соседних” объектов.

В бизнес-сервере в методе OnUpdateCar доступна инстанция сервиса данных ds через свойство DataService. При необходимости обращения к сервису данных из кода бизнес-сервера следует использовать именно эту инстанцию сервиса данных, поскольку приложения могут работать на нескольких сервисах данных и различных хранилищах. Получение сервиса данных из провайдера может повлечь ошибки прикладного характера. Также следует учитывать, что на момент вызова бизнес-сервера сервис данных ещё не выполняет SQL запросы, а только готовит данные для этого. Таким образом, обращаясь к хранилищу из метода бизнес-сервера мы наблюдаем хранилище в состоянии до изменений. Особенно осторожно нужно пользоваться операциями обновления данных, поскольку трензакция ещё не создана и изменение хранилища в бизнес-сервере может привести к неконсистентному состоянию, если сформированный SQL запрос после отработанных бизнес-серверов по какой-то причине завершится с ошибкой. Чтобы изменённые в бизнес-сервере объекты попали в общую транзакцию их нужно вернуть в методе бизнес-сервера.

Важно понимать, что объект UpdatedObject будет иметь ровно то состояние, которое было передано в ds.UpdateObjects плюс изменения в “соседних” бизнес-серверах. Хорошей практикой считается проверять загруженность свойств перед их изменением.

Особенности использования

Дополнительная информация об особенностях использования бизнес-серверов доступна в следующих статьях: