Чтобы разработанные Бизнес-операции были обнаружены фреймворком и в Модели Приложения были сгенерированы соответствующие узлы (без чего нормальное функционирование сервиса бизнес-операций невозможно),  требуется выполнить регистрацию разработанных классов Бизнес-операций и их реализаций. Для этого необходимо:

В XAF-модуле, содержащем классы Бизнес-операций и их реализаций, в его классе модуля (наследнике ModuleBase) нужно реализовать интерфейс IBusinessOperationContainer.

Интерфейс IBusinessOperationContainer декларирует свойство BusinessOperationTypes, которое должно возвращать перечисление типов, составляющих Бизнес-операцию. Это как сами классы Бизнес-операций, так и классы их реализаций. Такой подход к регистрации Бизнес-операций выбран из соображений производительности. Явное перечисление типов избавляет от необходимости сканирования всех типов приложения посредством технологии отражения с целью поиска Бизнес-операций и их реализаций.

Существует и альтернативный способ регистрации Бизнес-операций, который может использоваться во время выполнения приложения (runtime). Менеджер Бизнес-операций BusinessOperationManager (доступ к экземпляру менеджера осуществляется через статическое поле BusinessOperationManager.Instance) содержит метод RegisterBusinessOperation, который и выполняет регистрацию Бизнес-операции и ее реализаций в Модели Приложения. В качестве параметров методу передается тип регистрируемой Бизнес-операции и список ее реализаций.

Этот же метод служит для регистрации дополнительных реализаций уже зарегистрированнойБизнес-операции.

Ниже приведен пример регистрации Бизнес-операции и ее реализации.

 

  public sealed partial class XafariNorthwindDCBusinessOperationsModule : ModuleBase, IBusinessOperationContainer

   {

          public override void Setup(XafApplication application)

       {

          base.Setup(application);

           application.SetupComplete += AlternativeRegisterBusinessOperations;

           …

       }

 

      /// <summary>

      /// Перечень бизнес-операций и их реализаций в модуле

      /// </summary>

      IEnumerable<Type> IBusinessOperationContainer.BusinessOperationTypes

       {

          get

           {

              yield return typeof(ChangeFreightContext);

              yield return typeof(ChangeFreightContextDefaultImpl);

           }

       }

 

      /// <summary>

      /// Альтернативный способ регистрации бизнес-операций.

      /// </summary>

      /// <remarks>

      /// Регистрацию с помощью менеджера бизнес-операций нужно производить после инициализации менеджера.

      /// Поэтому использован обработчик события XafApplication.SetupComplete.

      /// </remarks>

      private void AlternativeRegisterBusinessOperations(object sender, EventArgs e)

       {

           BusinessOperationManager.Instance.RegisterBusinessOperation(

              typeof(CalcOrderTotal),

              new[] { typeof(CalcWithoutDiscount), typeof(CalcWithDiscount) }

           );

       }

   }