[ELMA3] Реализация собственного сервиса Web API
Cтатьи которые нужно прочитать
Ознакомьтесь со статьей Быстрый старт разработки расширений
Также нужно знать Компонентную модель системы
Более подробную информацию можно найти в расширенной статье article-795
Далее в Вашем модуле, Вам требуется реализовать класс компонент точки расширения IPublicService. Она выглядит следующим образом:
[Component] public class MyPublicService : IPublicService { public static Guid UID = new Guid(UID_S); public const string UID_S = "C4A86B2E-BDBF-41ED-B905-30C422D4A7EC"; #region Implementation of IPublicService /// <summary> /// Уникальный идентификатор сервиса /// </summary> public Guid Uid { get { return UID; } } /// <summary> /// Идентификатор модуля. Можно получить из <see cref="AssemblyModuleAttribute.Uid"/> /// </summary> public Guid ModuleUid { get { return EleWise.ELMA.Documents.__ModuleInfo.UID; } } /// <summary> /// Имя сервиса. /// Должно содержать только английские символы. /// Используется как часть пути доступа к сервису /// </summary> public string Name { get { return "MyPublicService"; } } /// <summary> /// Описание сервиса /// </summary> public string Description { get { return SR.T("Мой сервис"); } } #endregion }
IPublicService
UID_S - строкое представление Guid, уникального идентификатора данного сервиса. Данный идентификатор представлен исключительно в качестве примера, при создании своего сервиса Вам требуется сгенерировать свой.
ModuleUid - уникальный идентификатор модуля в котором расположен данный сервис. Получить его можно из AssemblyModuleAttribute.Uid. Для модуля Документы, будет выглядеть следующим образом: EleWise.ELMA.Documents.__ModuleInfo.UID.
Name - наименование сервиса, требуется указывать только английские символы.
Name - наименование сервиса, требуется указывать только английские символы.
Description - описание сервиса. Краткая информация о том какие методы реализует данный сервис.
Теперь необходимо создать компонент реализующий точку расширения IPublicServiceMethodsProvider.
[Component]
public class MyPublicServiceMethodProvider : IPublicServiceMethodsProvider
{
public IEnumerable<IPublicServiceMethod> GetMethods()
{
return new[]
{
new PublicServiceMethod(
MyPublicService.UID,
GetBudgetApprovementListExecutor.MethodName,
GetBudgetApprovementListExecutor.MethodDescription,
new Version(1, 0, 0),
data => new GetBudgetApprovementListExecutor(data))
{
ParametersDescriptor = GetBudgetApprovementListExecutor.ParametersDescriptor,
ResultDescriptor = GetBudgetApprovementListExecutor.ResultDescriptor
}
};
}
}
IPublicServiceMethodsProvider
GetMethods - метод возвращающий список методов (PublicServiceMethod) данного сервиса, для каждого метода нужно передать уникальный идентификатор сервиса, название метода, описание метода, версию, далее передаем инициализацию свойств ParametersDescriptor и ResultDescriptor. Подробнее об этих свойствах будет рассказано далее.
Для добавления метода в веб-сервис, нужно создать класс Executor унаследованный от PublicServiceMethodExecutor.
internal class GetBudgetApprovementListExecutor : PublicServiceMethodExecutor
{
#region Static for Method
public const string MethodName = "GetBudgetApprovementListExecutor";
public static string MethodDescription
{
get { return SR.T("Получить лист согласования бюджета"); }
}
public static TypeSerializationDescriptor ParametersDescriptor
{
get
{
return new TypeSerializationDescriptorBuilder()
.Item(b => b.Name("BudgetId").Descriptor(SR.T("Идентификатор документа (Int64)")))
.Descriptor;
}
}
public static TypeSerializationDescriptor ResultDescriptor
{
get
{
return new TypeSerializationDescriptorBuilder()
.Item(b => b.Name("Results").Descriptor(cb =>
{
cb.Item(ci => ci.Name("Stage").Descriptor(SR.T("Название этапа (String)")));
cb.Item(ci => ci.Name("Users").Descriptor(SR.T("Пользователи этапа (String)")));
}))
.Descriptor;
}
}
#endregion
public GetBudgetApprovementListExecutor(WebData parameters)
: base(parameters)
{
}
public WebData GetApprovementList()
{
long budgetId;
long.TryParse(Parameters.FindItem("BudgetId").Value, out budgetId);
var budgetApprovementManager = BudgetApprovementManager.Instance;
var approvallist = budgetApprovementManager.GetApprovementList(budgetId).Where(a=> !String.IsNullOrEmpty(a.StageName)).ToList();
approvallist.Sort((stage, approvementStage) => Comparer<long>.Default.Compare(stage.StageId, approvementStage.StageId));
var data = new WebData
{
Items = approvallist.Select(item => new WebDataItem()
{
Name = item.StageName,
Value = item.Users.IsNullOrEmpty() ? "" : item.Users
}).ToArray()
};
return data;
}
public override WebData Execute()
{
return GetApprovementList();
}
}
PublicServiceMethodExecutor
Самый главный метод Execute(), который возвращает непосредственно данные в виде WebData и WebDataItem - семейство классов для представления данных в структурированном виде.
Также, есть статическая часть для описания метода:
MethodName - наименование метода
MethodDescription - описание метода
ParametersDescriptor и ResultDescriptor - два свойства несущие абсолютно информационный характер, они используются при построении справки по методам сервиса. В системе ELMA справка находится по следующему пути:
*адрес сервера*/API/help