logo

[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 - наименование сервиса, требуется указывать только английские символы.
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