Запуск и выполнение Бизнес-операции может происходить в рамках Управляемой (длительной) Операции. Для этого в классе Бизнес-операции должен быть реализован интерфейс IBusinessOperationManaged.

Интерфейс декларирует свойство Process – объект Управляемой Операции, в рамках которой выполняется Бизнес-операция и два метода - ExecuteManaged(), и RollbackManaged(), запускающих Бизнес-операцию в управляемом контексте. При вызове данные методы инициализируют свойство Process экземпляром создаваемой Управляемой (длительной) Операции.

При разработке класса управляемой бизнес-операции вместо непосредственной реализации интерфейса IBusinessOperationManaged целесообразно воспользоваться готовым базовым классом BusinessOperationManagedBase. Класс реализует методы ExecuteManaged() и RollbackManaged(), а также предоставляет два защищенных виртуальных метода - CreateManagedOperation() и CreateManagedOperationStub().

Первый метод, CreateManagedOperation(), создает экземпляр класса ManagedOperation, в контексте которой выполняется Бизнес-операция. При необходимости кастомизации Управляемой Операции, метод можно перекрыть в классе разрабатываемой Бизнес-операции.

Второй метод, CreateManagedOperationStub(), служит для создания экземпляра класса ManagedOperationStub. ManagedOperationStub - это класс-заглушка Управляемой Операции. Он используется, если происходит обращение к свойству Process без его предварительной инициализации. Управляемую Бизнес-операцию допускается вызывать асинхронно, для чего вместо вызова ExecuteManaged(), вызывается метод Execute(). В коде класса-реализации управляемой Бизнес-операции может выполняться доступ к свойству Process. Класс ManagedOperationStub позволяет избежать повсеместных проверок следующего вида:

 

  public void Execute()

   {

       …

       If (Process != null)

           Process.NextStep(…

       …

 

Свойство Process реализовано в базовом классе так, что оно всегда будет проинициализировано.

Если описанное поведение по каким-либо причинам не устраивает разработчика – можно в своем коде перекрыть метод CreateManagedOperationStub() (например, заставив возвращать null).

В остальном разработка управляемой бизнес-операции не отличается от разработки, описанной в разделе Разработка класса бизнес-операции.