По умолчанию фрейморк использует метаданные бизнес-операции, которые хранятся не в модели приложения, а в бизнес-модели. Поэтому настройку бизнес-операций нужно выполнять с помощью редактора бизнес-модели (у меня редактор находится в 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. |