Новые функции

BC (BusinessComponents)

Доработан объект HierarchicalClassifierItem
  1. После удаления объекта учитывается модификатор удаления.
  2. Методы логики AfterConstruction и OnDeleting стали виртуальными.


В тип XafariObject добавлена поддержка динамических реквизитов

Data

Добавлено поле со значением по умолчанию для MemberMap

Добавлено поле (DefaultValue) для MemberMap, в котором хранится значение по умолчанию.
Поле используется в том случае, если в источнике не заполнено поле.

Добавлено вычисляемое поле

В схему мапирования добавлено новое поле вида
<TransValue>мортоделла = 1;шляпа = 2</TransValue>
в данном поле задается соответствие, по которому определяется как заменить входящее значение

Реализован экспорт/импорт связей многие ко многим

Настройка экспорта сущностей SecuritySystemUser и SecuritySystemRole
производится стандартными настройками. Проблема только в настройке импорта связки многие ко многим между сущностями.

В данной настройке необходимо именно так настраивать импорт пар пользователь-роль. IsManyToMany указывает на то, что будет экспорт пар. SecuritySystemUser указывает на то откуда брать начальную ссылку. Поскольку можно и от роли отталкиваться.
Roles это реальное поле SecuritySystemUser. SecuritySystemRole это имя поля в экспортированном xml файле.

Настройка импорта.
Эта настройка для сущностей SecuritySystemUser и SecuritySystemRole так же стандартна за исключением <KeyMemberName>oid</KeyMemberName>. oid именно с маленькой буквы поскольку через Oid импортировать не получится, это поле в сущностях readonly.

И также зеркальная настройка для импорта пар.

Дополнительно ко всему необходимо подписаться на событие ObjectCreating
и в нем закодировать связку пар.


Реализован новый DataSource MsAccessDataSource

Реализован новый DataSource, позволяющий производить импорт из баз данных Microsoft Office Access в XAF приложение.
Использование MsAccessDataSource приведено в демо примере Northwind.DC в приложении Xafari.Northwind.DC.Import_Caroline при импорте данных из базы MS Access (nwind.mdb).

Реализована возможность импорта/экспорта полей с битовым содержимым для изображений.

При экспорте/импорте идентификация типа данных производится по типу, указанному в файле маппинга. Тип данных для преобразования изображения в массив байтов при экспорте и наоборот преобразование массива байтов в изображение при импорте должен быть System.Drawing.Image.

Доработана иерархия интерфейсов импорта

Добавлены новые интерфейсы:

Добавлена первичная реализация ITypeSettings.
В ней реализован механизм сериализации/десериализации настройки по типу. Также реализованы перечисления предполагаемых режимов работы:

Настройка по типам привязывается через новое поле TypeSettings в ItypeMap.

Editors

Реализован WinExplorerListEditor, аналог ASPxExplorerListEditor

  1. Реализован WinExplorerListEditor, аналог ASPxExplorerListEditor.
  2. Добавлен пример в FC.

Для редактора XafariMultipleLookupEditor добавлены новые возможности
  1. Для редактора XafariMultipleLookupPropertyEditor добавлены возможности(аналогичные XafariLookupPropertyEditor):
    • быстро переходить на ListView;
    • открывать список в отдельном View.
  2. Изменен шаблон popup окна.
  3. Изменена документация.


Добавлены параметры в атрибут CreateListView

Добавлены параметры:

  • IsDefaultTreeListView — указывает является ли данное представление представлением по умолчанию с древовидным редактором (имеет смысл для иерархических типов).
  • IsDefaultGridListView — указывает является ли данное представление представлением по умолчанию со списковым редактором (имеет смысл для иерархических типов).


TabbedDetailPropertyEditor. Добавлена возможность поиска в панели закладок

Flow

Модуль документооборота использует модуль Xafari.BC.Tasks для организации списка работ.
  1. Убраны все наследники от IDocflowTask и ActionExecutor’ы для этих наследников.
  2. Вместо ActionAxecutor реализованы необходимые TaskAction.

Таким образом старая база данных будет неактуальна для новой версии документооборота.
Также работы больше не завершаются автоматически после выполнения.


Изменен механизм фильтрации задач пользователей по исполнителю

Фильтрация производится следующим образом:
Для администратора доступны\видны все задачи.
Если в задаче в качестве исполнителя задана роль, то данная задача будет доступна для исполнителей, входящих в эту и в дочерние роли.
Если в задаче в качестве исполнителя задана группа, то данная задача будет доступна для исполнителей, входящих только в эту группу (фильтрация по группам без учета иерархии).
Если в задаче в качестве исполнителя задан конкретный пользователь (TaskUser), то данная задача будет доступна для системного пользователя с именем выбранного пользователя (TaskUser).
Исходя из последнего условия, важно обеспечить совпадение имен системного пользователя и пользователя TaskList для работы со списком задач.

При завершении задачи больше не требуется обновление формы для изменения ее состояния

ManagedOperations

По нажатию кнопки отмены управляемой операции запускается проверка на наличие просроченных операций

Numerators

Оптимизирован механиз нумерации для большого количества объектов.

Если необходимо создать сразу большое количество объектов, например в ходе выполнения бизнес-операции, и сгенерировать для них номера, то желательно использовать следующий метод:

Т.е. заключить операцию по созданию объекта в метод BulkCode, передав туда objectSpace и код, в котором происходит создание объектов и применение нумераторов.

Reports

Реализован шаблон Analysis для отчетов Xafari на основе PivotGrid.

Реализован шаблон «Analysis» для отчетов Xafari на основе PivotGrid.
Функциональность шаблона «Analysis» реализована в модулях:

  • Xafari.Reports.Analysis — платформенно-независимый модуль.
  • Xafari.Reports.Analysis.Win — модуль для приложений Windows.
  • Xafari.Reports.Analysis.Web — модуль для приложений ASP.NET.

При подключении указанных модулей для отчетов становится доступным тип шаблона «Шаблон Analysis отчета».
В качестве источника данных сводной таблицы Analysis отчета может использоваться любое поле источника данных отчета, являющееся коллекцией. Тип элемента коллекции должен присутствовать в бизнес-модели приложения.
В Windows версии приложения при редактировании шаблона доступен дизайнер сводной таблицы (https://documentation.devexpress.com/#WindowsForms/CustomDocument1825).
Для развертывания Analysis шаблонов необходимо из дизайнера сохранить разметку в файл (Save Layout… на вкладке Layout) и в апдейтере соответствующего модуля приложения воспользоваться методами расширения ObjectSpace (которые находятся в пространстве имен Xafari.Reports.Analysis):


Реализован новый тип Xafari отчетов - Отчет в виде файла.

Реализован новый тип Xafari отчетов — Отчет в виде файла.
Назначение файловых отчетов — получение отчетов в виде файлов требуемого формата (текстовые, xml, csv и т.п.) для предоставления разного рода отчетности в другие учреждения в электронном виде (например, по e-mail).
Функционал выполнен в виде модулей:
Xafari.Reports.File;
Xafari.Reports.File.Win;
Xafari.Reports.File.Web.
Для создания отчета в виде файла прикладной разработчик, в дополнение к базовой инфраструктуре отчетов Xafari должен описать класс (генератор), унаследованный от XafariFileReportGenerator<TDataSource, TParameters>. Generic параметрами здесь выступает класс источника данных и класс параметров отчета.
В коде класса генератора требуется реализовать абстрактный метод GenerateCore(). Данный метод может создать произвольное количество потоков данных (метод GetStream), в которые посылаются требуемые данные отчетов.
Разработанный класс генератора необходимо зарегистрировать в системе отчетности с помощью вызова
ObjectSpace.RegisterFileReportTemplate<TReport, TFileReportGenerator>();
Регистрация выполняется в методе UpdateDatabaseAfterUpdateSchema() класса — апдейтера модуля, в котором реализован генератор.
После регистрации разработанный электронный отчет появляется в списке шаблонов указанного в методе регистрации Xafari отчета.
При выполнении электронного отчета на локальную машину клиента загружается zip-архив, содержащий все потоки данных в виде файлов, имена которых совпадают с именами потоков, переданных в метод GetStream.
Имя zip-архива задается в поле TemplateFileName шаблона электронного отчета ITemplateFileReport. При формировании имени архива используется ObjectFormatter. В форматтере доступны поля Parameters и DataSource — параметры и источник данных отчета соответственно.

Перед формированием отчета из детальной формы параметров происходит автоматическое сохранение параметров отчета.

Перед формированием отчета из детальной формы параметров происходит автоматическое сохранение параметров отчета. После формирования отчета выполняется обновление данных на детальной форме параметров.
Эти функции выполняет контроллер Xafari.Reports.Controllers.SaveRefreshReportParametersController. Если описанное поведение по каким-то причинам не подходит, то контроллер можно отключить.

При сохранении файлового отчета запоминается каталог и при последующих сохранениях он предлагается по умолчанию.

При сохранении файлового отчета запоминается каталог и при последующих сохранениях он предлагается по умолчанию.
Каталог последнего сохранения запоминается индивидуально для каждого отчета и пользователя.
Данный функционал актуален для Win версии приложения.

Скрытый текст

Доработаны шаблоны отчетов Xafari: действие по умолчанию, атрибуты «активный» и «системный», поле «имя сборки».

  • В шаблоны отчетов добавлен параметр «действие по умолчанию» (перенесен из параметров отчета). Действие по умолчанию выбирается из списка доступных действий UIService соответствующего шаблона (сохранить в файл, просмотр).
  • В параметрах есть поле «шаблон по умолчанию», который открывается при формировании. Если шаблон по умолчанию в параметре не задан — при формировании отчета отображается диалог выбора шаблона.
  • В шаблоны отчетов добавлен атрибут «Активный». При формировании отчета в диалоге выбора шаблона пользователю видны только активные шаблоны.
  • В шаблоны отчетов добавлен атрибут «Системный». Атрибут доступен только для чтения (значение устанавливается во время развертывания готового или создания нового шаблона и больше не меняется).
    Если атрибут установлен — наименование, дизайн формы, удаление выполнить нельзя. Нельзя запускать дизайнер. Но можно изменить признаки «Активный», «Действие по умолчанию».
  • В шаблоны отчетов добавлено поле «Имя сборки», из которой было выполнено развертывание шаблона. Имя сборки будет учитываться при обновлении системных отчетов.


Для отчетов Analysis реализовано отображение диаграмм.

Также при редактировании шаблона доступен мастер диаграмм (Дизайнер/Мастер диаграмм).

Реализовано клонирование шаблонов отчетов Xafari

На форму настроек отчета (XafariReportInfo) в панель инструментов списка шаблонов добавлено действие «клонировать шаблон».
При выполнении данного действия осуществляется клонирование текущего щаблона в списке.
Если клонируется системный отчет, то у клона сбрасывается атрибут «системный» и шаблон становится доступным для редактирования.

Доработан UI системы отчетности Xafari.

В объект XafariReportInfo (настройка отчета Xafari) добавлены поля:

  • поле Id отчета. По умолчанию видимо на детальной форме.
  • поле Namespace (в котором описан класс отчета). По умолчанию видимо в списковой форме.

Работают сортировки и группировки по полям XafariReportInfo.
Модифицирован ArmItemReport:

  • пункт «Редактировать …» заменен на «Настройка …». При его выполнении открывается детальная форма со списком параметров отчета и списком сохраненных отчетов. Список параметров отфильтрован по значению поля «Общий» (shared) (видны только свои параметры и общие параметры (у которых установлен признак «Общий»).

Диалог выбора шаблона:

  • заголовок окна приведен к виду: <имя_параметра>-<имя_отчета>.
  • При вызове действия «формировать отчет», если у отчета есть только 1 активный шаблон и не задан шаблон по умолчанию, то сразу используется этот единственный шаблон.
  • Для одного отчета открывается одно окно настроек (если оно уже открыто — получает фокус).
  • В окне редактирования параметров в выпадающем списке «шаблон по умолчанию» перечень возможных шаблонов ограничен только активными шаблонами.
  • При создании экземпляра шаблона вид шаблона сам определяет значение по умолчанию «действие по умолчанию».


Скрытый текст

Доработаны параметры отчетов Xafari:

  • в параметры отчетов добавлен атрибут «Общий» (Shared). Общий параметр видят все пользователи. В противном случае параметр «видит» только его создатель (CreatedUser).
  • в параметры отчетов добавлен атрибут «Активный» (Active). Активный параметр виден в списке параметров отчета в АРМ. В противном случае — нет. Пользователь может менять активность параметра по своему усмотрению.


Реализован простой механизм развертывания шаблонов отчетов Xafari.

Реализован простой механизм развертывания шаблонов отчетов Xafari.
Для каждого вида шаблонов отчетов Xafari созданы классы TemplateDeployment, позволяющие выполнять развертывание шаблонов отчетов:
Xafari.Reports.Xaf.TemplateDeployment
Xafari.Reports.Excel.TemplateDeployment
Xafari.Reports.Analysis.TemplateDeployment
Xafari.Reports.File.TemplateDeployment
Классы содержат статические методы (обобщенную и не обобщенную версии) для развертывания шаблона, а также методы расширения для IObjectSpace, выполняющие ту же функцию.
Методы позволяют выполнить развертывание шаблонов, данные разметки которых берутся либо из ресурсов, либо из произвольного потока. Это может быть файловый поток, поток, читающий разметку из БД и т.д.
Пример развертывания шаблонов отчета.
Для упрощения исключена обработка ошибок и визуализация процесса. С полной версией кода можно ознакомиться в демонстрационном приложении Northwind.DC.
Метод DeployOrdersReport выполняет развертывание шаблонов отчета OrderXafReport. Разметка шаблонов (layouts) хранятся в виде ресурсов той же сборки, в которой расположен данный метод (в данном случае это сборка Xafari.Northwind.DC.Reports).

Settings

Реализована возможность копированние в буфер полного системного пути к настройке.

В контекстное меню настроек добавлена возможность копирования в буфер полного системного пути к настройке.

Реализована возможность изменять значение настройки при изменении значения другой настройки

WorkPlaces

Реализована возможность в прикладном коде определять момент смены Workplace и запуска WorkplaceModelEditor.

Реализована возможность в прикладном коде определять момент смены Workplace и запуска WorkplaceModelEditor:

  • добавлены события, возникающие до и после смены рабочего места (WorkplaceManager.WorkplaceSwitching, WorkplaceManager.WorkplaceSwitched);
  • в соответствующие контроллеры добавлены свойства с модификатором доступа public, для предоставления доступа к действиям по переключению рабочего места и запуска редактора модели рабочего места (Xafari.Workplace.Web.Controllers.WorkplaceMainWindowController.SwitchWorkplaceAction, Xafari.Workplace.Win.Controllers.WorkplaceWindowController.EditWorkplaceModelAction, Xafari.Workplace.Win.Controllers.WorkplaceWindowController.SwitchWorkplaceAction).

Xafari

Для колонок добавлена настройка CaptionCalculator

Для колонок добавлена настройка CaptionCalculator принимающие следующие значения:

  1. Default — колонка именуется стандартным образом, то есть берется имя последнего свойства.
    Пример: свойство — «Сотрудник.Руководитель.Фамилия»; имя колонки — «Фамилия»
  2. FullMember — колонка именуется по полному имени свойства.
    Пример: свойство — «Сотрудник.Руководитель.Фамилия»; имя колонки — «Сотрудник.Руководитель.Фамилия»


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

Добавлено логирование управляемых операций по уровню критичности

Уровни: Off, Errors, Warnings, Info, Verbose
Используется enum System.Diagnostics.TraceLevel. В случае длительных операций значения Info и Verbose имеют одинаковый смысл – будет записываться вся информация о ходе выполнения. Errors – будут сохраняться только ошибки, Warnings – ошибки и предупреждения. Если выбран Off, то кнопка открытия протокола на форме будет недоступна.

Настройка уровней критичности осуществляется:

  • Через .config файл приложения(App.config/Web.config).
  • Непосредственно при объявлении операции.

Настройка уровня критичности с помощью .config файла осуществляется через переменную

Для каждой операции можно вручную задать желаемый уровень критичности. Это делается при объявлении операции:

Если уровень задан явно при создании управляемой операции, то именно он, а не значение из .config файла будет использован при логировании процесса.


Добавлен функционал множественного выбора


Добавлены публичные свойства для доступа к контролам шаблонов Wizard, реализован дополнительный шаблон без заголовка


DomainLogicBase.GetWeakList() поддерживает типизированную BackReference


Добавлен DC HierarchyNode, реализующий интерфейс IHierarchyNode


Реализована функция филиальности на уровне Xafari. Первый этап.

Модуль «Филиальность» предназначен для частичной изоляции данных различных организационных структур. Использование данного модуля позволяет прозрачно автоматизировать компании холдингового типа. При этом обеспечивается возможность получения консолидированной отчетности по корпорации в целом с группировкой и фильтрацией данных в разрезе филиалов. Функционал модуля позволяет эффективно управлять правами доступа к информации: в единой базе собственные данные для филиала полностью открыты, доступ к данным остальных филиалов регламентируется в соответствии с установленными правами. Несанкционированный доступ к информации филиалов исключается.
При подключении модуля Xafari.BC.Branches появляется возможность в одной базе/конфигурации данных вести множество отдельных филиалов/компаний. Можно установить какие сущности (справочники, документы) являются «филиальными» (локальными — изолированы для каждого филиала), а какие общие для всех филиалов. Кроме того даже для филиальных сущностей выбранные элементы можно сделать общими (shared) они будут доступны во всех филиалах.
Для каждого пользователя можно указать к каким филиалам он имеет доступ, а к каким нет. При этом можно задать права на чтение или запись сущностей из определённых филиалов. Если пользователи имеют доступ к нескольким филиалам, есть возможность установить режим чтения: все доступные филиалы или текущий филиал.
В режиме видимости всех доступных филиалов, пользователь имеет права на запись только для того филиала, под которым он выполнил вход в систему, конечно при условии, что текущий филиал доступен пользователю для записи. В режиме чтения «текущий филиал» пользователь видит только сущности того филиала, под которым он выполнил вход в систему, а также общие данные.

Добавлена опция EntityFactory.EnabledInDesignMode = false

Бизнес-операции

В атрибутах бизнес-операций помимо DisplayNameAttribute можно использовать атрибут XafDisplayName.


Если бизнес-операция представлена в BOModel, то в качестве формы ввода параметров используется DetailView самой бизнес-операции.

Если бизнес-операция представлена в BOModel, то в качестве формы ввода параметров используется DetailView самой бизнес-операции вместо генерации DetailView с помощью DynamicPropertiesObject, как это делается по умолчанию.
Применив к классу бизнес-операции атрибут DomainComponentAttribute, фреймворк сгенерирует для класса детальное представление. Это представление будет автоматически использовано в качестве формы ввода параметров бизнес-операции.

Разработаны команды запуска произвольных бизнес-операций для консольной утилиты RunCmd

Разработаны команды запуска произвольных бизнес-операций для консольной утилиты RunCmd:

  1. Команда BusinessOperationHelp (краткое наименование boph).
    — Отображает текущую справку.
    — Дополнительных параметров не требует.
    Примеры:
    RunCmd BusinessOperationHelp
    RunCmd boph
  2. Команда BusinessOperationList (краткое наименование bopl).
    — Выводит список доступных бизнес-операций.
    — Дополнительных параметров не требует.
    Примеры:
    RunCmd BusinessOperationList
    RunCmd bopl
  3. Команда BusinessOperationInfo (краткое наименование bopi).
    — Отображает детальную информацию об указанной бизнес-операции.
    — В качестве параметра передается идентификатор (ID) любой зарегистрированной в системе бизнес-операции (любой бизнес-операции из списка команды BusinessOperationList).
    Примеры:
    RunCmd BusinessOperationInfo Id:»Xafari.Northwind.DC.BusinessOperations.ChangeFreightContext»
    RunCmd bopi Id:»Xafari.Northwind.DC.BusinessOperations.ChangeFreightContext»
  4. Команда BusinessOperationRun (краткое наименование bopr).
    — Выполняет (Execute) или откатывает (Rollback) указанную бизнес-операцию.
    — В параметрах команды указывается идентификатор (ID) бизнес-операции, вызываемый метод и, если необходимо, можно задать параметры, значениями которых будут проинициализированы одноименные параметры указанной бизнес-операции.
    — С помощью необязательного параметра «Method» можно указать, нужно ли выполнить бизнес-операцию, или осуществить откат. Допустимыми значениями для параметра «Method» являются «Execute», «Rollback».
    Примеры:
    RunCmd BusinessOperationRun Id:»SomeReversibleBusinessOperation» Method:Rollback
    RunCmd bopr Id:»SomeReversibleBusinessOperation»

Существует несколько способов передачи параметров выполняемой бизнес-операции:

  1. Параметры перечисляются непосредственно при вызове команды. Параметры задаются в виде разделенной двоеточием пары <имя>:<значение>. Сами пары имя-значение разделяются между собой одним или несколькими пробелами. В качестве значения может передаваться любой текст не содержащий пробелов, символов ‘»‘. При необходимости указать в значении пробел или символ ‘»‘, все значение заключается в кавычки (символ ‘»‘). Все символы ‘»‘ внутри значения должны удваиваться. В общем случае правила задания значений в командной строке диктуются правилами командного процессора windows.
    Пример:
    RunCmd BusinessOperationRun id:"Xafari.Northwind.DC.BusinessOperations.ChangeFreightContext" Orders:"[{""Oid"":""B95C5919-1562-401A-A26F-00094911E33A""}]" Percent:10
    Для указания значений параметров сложных типов (в том числе персистентных) используется нотация JSON (см. далее).
  2. Параметры инициализации бизнес-операции задаются в виде строки в формате JSON. Для этих целей служит параметр команды «JsonStr». Значением этого параметра является строка JSON. При формировании строки необходимо придерживаться требований командного процессора windows, описанных в пункте 1.
    Пример:
    RunCmd BusinessOperationRun id:"Xafari.Northwind.DC.BusinessOperations.ChangeFreightContext" jsonstr:"{""Orders"":[{""Oid"":""B95C5919-1562-401A-A26F-00094911E33A""}], ""Percent"":10}"
  3. Параметры инициализации бизнес-операции задаются в текстовом файле формата JSON. Для этих целей служит параметр команды «JsonFile». Значением этого параметра является имя файла, содержащий текст JSON. При напиании текстового файла необходимо руководствоваться только описанием формата JSON.
    Пример:
    RunCmd BusinessOperationRun id:"Xafari.Northwind.DC.BusinessOperations.ChangeFreightContext" jsonfile:json.txt
    Содержимое файла json.txt:

Основные принципы задания параметров с помощью JSON (описание выполнено на основе примера, приведенного в конце справки).

  • Значение полей простых типов (byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, enum) могут приводиться непосредственно, без заключения в кавычки. Также допустимо и строковое представление значение (т.е. заключенного в кавычки). В этом случае для преобразования строки в целевое значение используется экземпляр TypeConverter соответствующего целевого типа.
  • Значения полей для типов string, Uri, Guid, указываются в виде строки (заключенной в кавычки). Таким же образом может быть задано значение Enum. В примере это свойства StringProp, GuidProp, UriProp, EnumProp2.
  • Для указания значений типа DateTime или DateTimeOffset рекомендуется использовать строковое значение в формате, независимом от культуры (форматы «o», «r», «R», «s», «u», U»). Поддерживается также способ, приведенный в описании класса System.Web.Script.Serialization.JavaScriptSerializer (см. ссылки ниже). В примере это такие свойства, как DateTimeProp1, DateTimeProp2, DateTimeOffsetProp.
  • Свойства типа коллекций задаются в нотации массивов JSON: заключенный в ‘[‘, ‘]’, разделенный запятыми список значений. В примере это такие свойства, как IntArrayProp, GenericListOfStrings, ArrayListProp.
  • Свойства, представляющие собой объекты, задаются в нотации объектов JSON: заключенные в ‘{‘, ‘}’ перечень полей. В примере это XpoPersistentProp, XpoUntypedPersistentProp, SimpleClassProp. При создании экземпляра объектов, если для типа не зарегистрирован отдельный конвертер, десериализатор по умолчанию использует активатор. Это значит, что класс должен иметь конструктор по умолчанию.
  • При инициализации свойств можно указать тип конкретного объекта, которым будет инициализировано свойство. Для этого используется ключ «__type». В примере это свойство XpoUntypedPersistentProp. Экземпляр создается либо активатором, либо зарегистрированным конвертером.
  • Инициализация параметров бизнес-операций, представляющих собой персистентные объекты DevExpress.

Персистентный объект можно указать несколькими способами (см. пример инициализации полей XpoPersistentProp, XpoPersistentListProp):

  1. Описывается JSON объект с указанием ЕДИНСТВЕННОГО поля, являющегося ключевым (в примере это «Oid») и его строкового значения. Имя ключевого поля должно совпадать с реальными именем ключевого поля персистентного объекта. При десериализации такого объекта выполняется поиск объекта в БД по указанному значению ключевого поля (операция ObjectSpace.GetObjectByKey).
  2. Описывается JSON объект с указанием произвольного поля или нескольких полей персистентного объекта и их значений. При десериализации такого объекта на основе указанных полей и их значений строится критерий вида: «[поле_1] = значение_1 AND [поле_2] = значение_2 AND…). Затем выполняется поиск первого попавшегося объекта в БД, удовлетворяющего заданному критерию (операция ObjectSpace.FindObject).
  3. Описывается JSON объект с использованием специального ключа «__criteria». В этом случае можно указать произвольный критерий. При десериализации такого объекта строковое значение критерия передается методу CriteriaOperator.Parse(), после чего данный критерий объединяется с остальными (если таковые имеются) операцией AND. Затем выполняется поиск первого попавшегося объекта в БД, удовлетворяющего заданному критерию (операция ObjectSpace.FindObject).

Для десериализации из формата JSON используется класс System.Web.Script.Serialization.JavaScriptSerializer (см. http://msdn.microsoft.com/ru-ru/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx).
Подробное описание формата JSON можно посмотреть:
http://json.org/json-ru.html
https://ru.wikipedia.org/wiki/JSON
http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic5
******
ПРИМЕР
Класс бизнес-операции:

***
JSON файл для инициализации бизнес-операции:

Инсталлятор

Интегрирован вызов операции импорта при инсталляции продукта Xafari

Запуск исполняемого файла импорта выполняется в случае НОВОЙ установки Xafari после завершения процесса инсталляции. Запуск импорта производится из директории инсталляции демо примеров папки Northwind.DC\Win\Xafari.Northwind.DC.Import_Caroline.exe, в случае отсутствия исполняемого файла импорта запуск не произведется. Работа мастера установки завершается запуском файла без ожидания завершения успешной обработки операции (на случай отсутствия установленного SQLEXPRESS).
Описание Action:

Action производит запуск исполняемого файла Xafari.Northwind.DC.Import_Caroline.exe из директории определенной переменной DEMOS_NORTHWIND_DC_WIN например для Xafari 13.2 c:\Users\Public\Documents\Xafari Framework v13.2 Demos\Northwind.DC\Win\ установлено возвращаемое значение asyncNoWait — асинхронный вызов, установщик не будет дожидаться окончания выполнения, которое может наступить даже после завершения работы установщика.
Вызов Action:

Вызов Action-а производится After=»InstallFinalize»> после завершения процесса инсталляции (визуально открывается в окне инсталлятора будет конечное окно с кнопкой «Готово»). Вызов производится при условии NOT Installed – если Xafari устанавливается первоначально.

Общие вопросы

Добавлены методы HierarchyNodePersistentHelper

  1. Добавлен метод HierarchyNodePersistentHelper.AfterConstruction, с помощью которого происходит обновления свойства HierarchyFullPath
  2. Убрано использование ObjectSpace’а из методов класса HierarchyNodePersistentHelper, все логика методов основывается на Session

Добавлены настройки в модель приложения

Узел настроек IModelClass расширен настройками DefaultTreeListView и DefaultGridListView.
Данные настройка предназначены для бизнес — объектов иерархического типа:

  • DefaultTreeListView — настройка определяет списковую форму по умолчанию, с древовидным редактором;
  • DefaultGridListView — настройка определяет списковую форму по умолчанию, со списковым редактором(пример: GridListEditor).

Значения по умолчанию для вышеупомянутых свойств берется из свойства DefaultListView.


Реализован сервер отчетов

Сервер расчетов — это распределенный сервер, обрабатывающий сообщения из очереди сообщений и сохраняющий результат в базу данных.
Сервер необходим для формирования расчетов на стороне сервера, не блокируя работу приложения пользователя, освобождая ресурсы компьютера, откладывая и выполняя расчеты по расписанию, сохранения результаты работы в базу данных.
Очередь сообщений единая и хранится в базе данных приложения, для которого используется сервер расчетов.
Для сервера расчетов была реализована очередь сообщений, в которую клиенты генерируют новые сообщения, обрабатывающиеся на сервере приложений.
На основе сервера расчетов был реализован сервер отчетов, при помощи которого отчеты формируются на сервере и сохраняются в базе данных. Сохраненные отчеты доступны клиентским приложениям.

Сервер расчетов

Реализована команда StartXafariServer, запускающая Xafari Server в консольном режиме

Команда реализована в модуле Xafari.Server.dll
Для использования команды в конфигурационный файл утилиты RunCmd необходимо включить модуль Xafari.Server (а также модули, реализующие конкретные функции сервера, например, Xafari.Reports.Server).
По остальным настройкам конфигурационного файла RunCmd.exe.config см. документацию по утилите RunCmd.exe (http://xafari.ru/news/konsolnaya-utilita-vypolneniya-funkcij-modulej-xafari.html)
В конфигурационном файле приложения, использующего возможности Xafari Server, в секции appSettings, необходимо указать ключ <add key=»UseDedicatedXafariServer» value=»True» />.
Пример запуска Xafari Server:
RunCmd.exe StartXafariServer /logon AuthenticationType:ActiveDirectory

Устраненные проблемы

Arms

Проведено профилирования Web-компонентов Xafari. Устранены утечки памяти (T102.57153 )

BC (BusinessComponents)

Значения ключевого поля объекта вычисляется с помощью метода у сессии. (T102.56898 )

Значения ключевого поля объекта вычисляется с помощью метода у сессии.

DockPanels

Скрытый текст

Исправлена ошибка изменения подписей пункта меню «панели»

Изменен шаблон для DockPanel'ей (T102.57811 )

Изменен шаблон для DockPanel’ей

Editors

Скрытый текст

XafariLookupEditor
Если нажать на «…», то открывается ListView, которую указали в атрибуте «View»(в модели приложения в узле настройки определенной колонки)

Добавлена синхронизация значений в XafariLookupPropertyEditor, если объект был изменен. (T102.56914 )

Добавлена синхронизация значений в XafariLookupPropertyEditor, если объект был изменен.

Win. Свойства LookupEditorMode для свойств типа IHierarchyNode выставляется по умолчанию (T102.57115 )

Win. Свойства LookupEditorMode для свойств типа IHierarchyNode выставляется по умолчанию

Скрытый текст

Ошибка возникала при двойном клике по GridControl’у в случае, если кликали не по строке записи.
Добавлена проверка на клик по «строке-записи».

Изменена логика работы HierarchyNodeInterfaceAdapter. Критерий меняется при изменении критерия в CollectionSource. (T102.57476 )

Изменена логика работы HierarchyNodeInterfaceAdapter. Критерий меняется при изменении критерия в CollectionSource.

Исправлена ошибка при попытке пометить все записи в автофильтре на списковой форме при использовании GridViewMultipleSelectByCheckBoxController (T102.57722 )

Вместо контролллера GridViewMultipleSelectByCheckBoxController для осуществления множественного выбора с помощью CheckBoxes используется XafariGridListEditor, в котором такой ошибки не возникает

Flow

В списке работ группы работ не видны (T102.57826 )

В списке работ группы работ не видны

ManagedOperations

Oтключено реагирование системы на закрытие popup окна (T102.57501 )

Oтключено реагирование системы на закрытие popup окна

Исправлена ошибка, при которой управляемые операции не становились просроченными (T102.57908 )

Исправлена ошибка, при которой управляемые операции не становились просроченными

Northwind

DockPanel'и отключены в демо приложениях, для данной версии Xafari функционал DockPanel неработоспособный (T102.57710 )

DockPanel’и отключены в демо приложениях, для данной версии Xafari функционал DockPanel неработоспособный

Reports

Устранены ошибки при работе с отчетами в многопользовательском режиме. Класс BaseReportDataSource переименован в XafariReportDataSourceBase. (T102.57590 )

Базовый класс источника данных отчетов Xafari сделан неперсистентным (обычным классом).
Класс BaseReportDataSource переименован в XafariReportDataSourceBase).
Теперь при написании алгоритма наполнения источника данных необходимо просто создавать его экземпляр:

Settings

Добавлен метод работы с настройками персистентного типа (T102.57481 )

  1. Изменена документация «Настройки приложения — Руководство для разработчика.docx» необходимо обновить документацию на сайте.
  2. При работе с настройки персистентного типа необходимо учитывать то, что механизм настроек использует свой собственный ObjectSpace для работы со слоями , а также для работы с персистентными значениями настроек.

Может возникнуть следующая ситуация:

  1. Вы получаете значение настройки персистентного типа, следовательно, внутренний ObjectSpace настроек кэширует данный объект.
  2. Из другого ObjectSpace`а вы меняете значения свойств объекта, который храниться как значение настройки, и соммитите изменения.
  3. Если после выполнения пунктов 1 и 2 вы снова попросите значение персистентной настройки, то вернётся объект из кэша внутреннего ObjectSpace настроек, и как следствие вернётся объект без учёта изменение в пункте 2.

Для получения актуального значения настройки для персистентных настроек введён метод «GetValue(IObjectSpace objectSpace)», который возвращает персистентный объект использую входящий ObjectSpace.
Для случая, когда необходимо получения актуальных значений из внутреннего ObjectSpace настроек(обновление ВСЕГО кэша) сначала обновите внутренний ObjectSpace с помощью следующего кода:
SettingsAccessor.Inctance.ObjectSpace.Refresh() — имейте в виду, что после этого метода дальнейшая работа с настройками замедлится до тех пор, пока функциональность настроек не закэширует нужные ей данные.

Xafari

Исправлена ошибка при выборе отображения всех записей для форм с частичной загрузкой (T102.57275 )

Исправлена ошибка при выборе отображения всех записей для форм с частичной загрузкой

Исправлена работа фильтра по колонке в частичной загрузке данных (T102.57392 )

Исправлена работа фильтра по колонке в частичной загрузке данных

Изменил место восстановления LayoutControl'a. (T102.57473 )

Изменил место восстановления LayoutControl’a.

Реализована инициализация поля Data. (T102.57546 )

Переделан функционал поддержки SingleChoiceAction’a AggregatedAction’ом.
Теперь каждый ChoiceActionItem AggregatedAction’a в поле Data хранит информацию об объекте на основании которого он построен.

Исправление неверного отображения представлений в панели категорий (T102.57721 )

Исправление неверного отображения представлений в панели категорий

Добавлена проверка наличия узлов локализации для Xafari.Win.Messaging.ExceptionBox (T102.57793 )

Добавлена проверка наличия узлов локализации для Xafari.Win.Messaging.ExceptionBox

Добавлена проверка на запуск дизайнера в VS (T102.57846 )

Добавлена проверка на запуск дизайнера в VS

Бизнес-операции

Контекстные бизнес-операции теперь учитывают возможность использования EntityFactory приложением (корректно выполняется определение соответствия контекста). (T102.56876 )

Контекстные бизнес-операции теперь учитывают возможность использования EntityFactory приложением (корректно выполняется определение соответствия контекста).

Общие вопросы

Убрана локализация служебного enum (Xafari.Win.PartSize) из пользовательской модели (T102.57148 )

Убрана локализация служебного enum (Xafari.Win.PartSize) из пользовательской модели