Способ выполнения управляемой бизнес-операции

StatusIDPriorityType
Closed2710ОбычныйВопрос
ProfileReply
Viktor SavitskiClient

Имею управляемую бизнес-операцию (наследник от BusinessOperationManagedBase).
БО у меня помечена атрибутом ExecutionWayAttribute ( [ExecutionWay(ExecutionWays.Synchronous)])

БО стартую в коде:

ImportExcel importExcel = new ImportExcel();
importExcel.SettingsFilePath = settingsFile;
importExcel.DataFilePath = dataFile;
importExcel.ExecuteManaged();

Хоть я и вызываю метод ExecuteManaged(), бизнес-операция все равно запускается у асинхронно.
Что я делаю не так?

Replies

UserDescriptionPosted On
Oleg KrupenkinSupport Manager

По умолчанию фрейморк использует метаданные бизнес-операции, которые хранятся не в модели приложения, а в бизнес-модели. Поэтому настройку бизнес-операций нужно выполнять с помощью редактора бизнес-модели (у меня редактор находится в C:\Program Files (x86)\Galaktika\Xafari Framework v13.2\Tools\ProjectEditor\Project.xafml.Editor.exe). Если же проект не использует бизнес-модель, то необходимо выполнить маппинг бизнес-модели на модель приложения. Для этого в классе платформенно-независимого модуля приложения нужно реализовать такой обработчик события Project.CustomizeProjectInstance:

public override void Setup(XafApplication application)
{
  base.Setup(application);
  …
  Project.CustomizeProjectInstance += CustomizeProjectInstance;
  …
}
private void CustomizeProjectInstance(object sender, EventArgs e)
{
  var project = (Project) sender;
  project.ApplicationModel = (ModelApplicationBase)project.XafApplication.Model;
}

Что касается атрибута ExecutionWayAttribute. Данный атрибут принимается во внимание только контроллером Xafari.BC.BusinessOperations.Controllers.BOExecViewController. Дело в том, что синхронность/асинхронность выполнения не является характеристикой самой длительной операции. Разработчик сам решает, ожидать окончания выполнения длительной операции, или нет. Поэтому, если есть необходимость в коде выполнить длительную бизнес-операцию синхронно, то разработчик должен сам позаботиться об отображении процесса выполнения и об ожидании окончания выполнения длительной операции. Для решения подобных задач в составе платформы Xafari есть класс SyncManagedOperationHelper. Пример его использования, применительно к описанному случаю:

var importExcel = new ImportExcel();
importExcel.SettingsFilePath = settingsFile;
importExcel.DataFilePath = dataFile;
var mo = importExcel.ExecuteManaged();
var managedHelper = SyncManagedOperationHelper.CreateHelper(mo);
managedHelper.InitShowViewParameters(showViewParameters, false);

Следует отметить, что поскольку SyncManagedOperationHelper требуется создавать представление (DetailView), отображающее процесс выполнения длительной операции, то данный вызов нужно выполнять в рамках какого-либо действия (Action), где есть доступ к экземпляру класса ShowViewParameters.

 

Viktor Savitski

Спасибо, Oleg.

× This ticket is closed.