Имеется возможность запустить произвольную Бизнес-операцию с помощью консольной утилиты RunCmd. Модуль XafariBusinessOperationsCommandsModule (сборка Xafari.BC.BusinessOperations.Commands.dll) предоставляет для этих целей следующие команды:

Команда BusinessOperationHelp (краткое наименование boph).

  - Отображает текущую справку.

  - Дополнительных параметров не требует.

  Примеры:

   RunCmd BusinessOperationHelp

   RunCmd boph

Команда BusinessOperationList (краткое наименование bopl).

  - Выводит список доступных бизнес-операций.

  - Дополнительных параметров не требует.

  Примеры:

   RunCmd BusinessOperationList

   RunCmd bopl

Команда BusinessOperationInfo (краткое наименование bopi).

  - Отображает детальную информацию об указанной бизнес-операции.

  - В качестве параметра передается идентификатор (ID) любой зарегистрированной в системе бизнес-операции (любой бизнес-операции из списка команды BusinessOperationList).

  Примеры:

   RunCmd BusinessOperationInfo Id:"Xafari.Northwind.DC.BusinessOperations.ChangeFreightContext"

   RunCmd bopi Id:"Xafari.Northwind.DC.BusinessOperations.ChangeFreightContext"

Команда 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:

{

  "Orders":[{"Oid":"B95C5919-1562-401A-A26F-00094911E33A"}],

  "Percent":10

}

 

Основные принципы задания параметров с помощью 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

 

ПРИМЕР

Класс бизнес-операции:

 

public class BusinessOperation1 : BusinessOperationBase

{

    public byte ByteProp { get; set; }

    public sbyte SbyteProp { get; set; }

    public short ShortProp { get; set; }

    public ushort UshortProp { get; set; }

    public int IntProp { get; set; }

    public uint UintProp { get; set; }

    public long LongProp { get; set; }

    public ulong UlongProp { get; set; }

    public char CharProp { get; set; }

    public float FloatProp { get; set; }

    public double DoubleProp { get; set; }

    public decimal DecimalProp { get; set; }

    public String StringProp { get; set; }

    public Guid GuidProp { get; set; }

    public Uri UriProp { get; set; }

    public TestEnum EnumProp1 { get; set; }

    public TestEnum EnumProp2 { get; set; }

    public DateTime DateTimeProp1 { get; set; }

    public DateTime DateTimeProp2 { get; set; }

    public DateTimeOffset DateTimeOffsetProp { get; set; }

    public int[] IntArrayProp { get; set; }

    public IList<string> GenericListOfStrings { get; set; }

    public ArrayList ArrayListProp { get; set; }

    public XpObject1 XpoPersistentProp { get; set; }

    public IList<XpObject1> XpoPersistentListProp { get; set; }

    public object XpoUntypedPersistentProp { get; set; }

    public SimpleClass SimpleClassProp { get; set; }

}

 

public class XpObject1 : BaseObject

{

    public XpObject1(Session session) : base(session) {}

    public int Code {

        get { return GetPropertyValue<int>("Code"); }

        set { SetPropertyValue("Code", value); }

    }

    public string Name {

        get { return GetPropertyValue<string>("Name"); }

        set { SetPropertyValue("Name", value); }

    }

}

 

public class SimpleClass

{

    public string Name { get; set; }

    public int Count { get; set; }

}

 

public enum TestEnum { One = 1, Two =2, Three = 3 };

 

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

 

{

  "ByteProp"                : 251,

  "SbyteProp"               : -125,

  "ShortProp"               : -32768,

  "UshortProp"              : 65535,

  "IntProp"                 : -2147483648,

  "UintProp"                : 4294967295,

  "LongProp"                : -9223372036854775808,

  "UlongProp"               : 18446744073709551615,

  "CharProp"                : "c",

  "FloatProp"               : -3.402823e38,

  "DoubleProp"              : 1.79769313486231e308,

  "DecimalProp"             : -79228162514264337593543950335,

  "StringProp"              : "test",

  "GuidProp"                : "c1bb3433-c01a-4e63-b1a2-950c37b3ebff",

  "UriProp"                 : "http://www.xafari.net/",

  "EnumProp1"               : 1,

  "EnumProp2"               : "Two",

  "DateTimeProp1"           : "\/Date(1411108851925)\/",

  "DateTimeProp2"           : "2000-01-02T17:18:19",

  "DateTimeOffsetProp"      : "2014-09-19T10:06:34+03:00",

  "IntArrayProp"            :[23,42,120],

  "GenericListOfStrings"    :["glsitem0", "glsitem1"],

  "ArrayListProp"           :["alitem0", 123],

  "XpoPersistentProp"       :{"Oid":"B95C5919-1562-401A-A26F-00094911E33A"},

  "XpoUntypedPersistentProp":{"__type":"Tests.XpObject1",  "Oid":"B95C5919-1562-401A-A26F-00094911E33A"},

  "XpoPersistentListProp"   :

     [

        {"Oid\"      :"B95C5919-1562-401A-A26F-00094911E33A"},

        {"__criteria":"[Code] = 5 OR [Code] = 6\"},

        {"Code"      :3},

        {"Name"      :"NX"}, /*Если существует несколько объектов с таким именем, то будет извлечен первый попавшийся */

        {"Oid"       :"B95C5919-1562-401A-A26F-00094911E33A", "Code":2} /* По данному критерию объект не будет найден */

     ],

  "SimpleClassProp"         :{"Name":"name_value", "Count":456 }

}