SysOperation Framework в MS DAX 2012

Архитектура SysOperation появилась в MS DAX 2012, она позволяет создать логику приложения, которая поддерживает выполнение, как в интерактивном, так и пакетном режиме. Данная архитектура представляет интерфейс, с помощью которого пользователь может настроить входные параметры. Также архитектура SysOperation может быть интегрирована с пакетным сервером для пакетной обработки задач, это обеспечивает повышение производительности операций. SysOperationFramework обеспечивает поддержку запросов, сериализации параметров и т.д.

SysOperationFramework основан на архитектуре MVC (Model View Controller) с изоляцией параметров (Model), диалогового окна (View) и службы (Controller) для исполняемого кода.

SysOperationFramework предназначен заменить архитектуру RunBase поэтому в MS DAX 2012 рекомендуется использовать SysOperation для создания бизнес логики, требующей пакетной обработки.

Ключевые объекты архитектуры SysOpertion

— Service. Класс Service наследуется от класса SysOperationServiceBase и содержит бизнес логику.

— Data Contract. Класс DataContract это класс модели, определяющий атрибуты, которые могут быть отображены в диалоговом окне в виде полей.

— Controller. Класс Controller наследуется от класса SysOperationServiceController и содержит информацию о режиме выполнения, диалоговом окне и т.д.

— UIBuilder. Класс UIBuilder наследуется от класса SysOperationAutomaticUIBuilder и используется для детальной настройки отображения полей в диалоговом окне.

Пример использования архитектуры SysOperation

Класс Controller

public class TestSysOperationControllerClass extends SysOperationServiceController
{
}
 
public void new()
{
    super();
    
    this.parmClassName(classStr(TestSysOperationServiceClass)); //указываем класс service
    this.parmMethodName(methodStr(TestSysOperationServiceClass, process)); //указываем метод класса service, который является точкой входа
}
 
public static void main(Args args)
{
    TestSysOperationControllerClass controller;
    
    controller = new TestSysOperationControllerClass();
    controller.startOperation();
}

Класс Service

public class TestSysOperationServiceClass extends SysOperationServiceBase
{
}
//на входе метода указывается контракт в случае если он существует 
public void process(TestSysOperationDataContractClass _contract)
{
    info(strFmt("Select date %1, year %2", 
                _contract.parmDateValue(), 
                _contract.parmYearValue()));
}

Класс DataContract

[DataContractAttribute, //атрибут указываеющий что класс является контрактом
 SysOperationContractProcessingAttribute(classStr(TestSysOperationUIBuilderClass))] //атрибут указывающий на ссылку на класс UIBuilder
public class TestSysOperationDataContractClass
{
    TransDate   dateValue;
    Year        yearValue;
}
 
[DataMemberAttribute, //атрибут указывающий что метод является полем
 SysOperationLabelAttribute('Date'), //метка поля
 SysOperationHelpTextAttribute('Enter a date'), //подсказка поля
 SysOperationDisplayOrderAttribute('1') //порядок вывода поля на форму
]
public TransDate parmDateValue(TransDate _dateValue = dateValue)
{
    dateValue = _dateValue;
    return dateValue;
}
 
[DataMemberAttribute,
 SysOperationControlVisibilityAttribute(false) //настройка видлимости поля на форме
]
public Year parmYearValue(Year _yearValue = yearValue)
{
    yearValue = _yearValue;
    return yearValue;
}

Класс UIBuilder

public class TestSysOperationUIBuilderClass extends SysOperationAutomaticUIBuilder 
{
    DialogField dateField;
}
 
public void postBuild()
{
    super();
    
    dateField = this.bindInfo().getDialogField(this.dataContractObject(), 
                                    methodStr(TestSysOperationDataContractClass, parmDateValue));
}
 
public void postRun()
{
    super();
    //переопределение метода у поля Date
    dateField.registerOverrideMethod(methodstr(FormDateControl, modified), 
                methodstr(TestSysOperationUIBuilderClass, modifiedDateValue), this);
}
//метод переопределения modified
public void modifiedDateValue(FormDateControl _ctrl)
{
    TestSysOperationDataContractClass contract;
    
    if (_ctrl.dateValue())
    {
        contract = this.getRdlContractInfo().dataContractObject();
        contract.parmYearValue(year(_ctrl.dateValue()));
    }
}

 

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar