Реализация OData_v2-сервиса в ABAP через композицию
В предыдущей главе мы реализовали базовые операции в OData-сервисе без каких-либо архитектурных паттернов. Однако, при решении практических задач это может быть не слишком удобно и может усложнить поддержку и расширение проекта. Поэтому «мой» подход к разработке OData-сервисам – это разработка с помощью композиции: то есть, когда в классе *MPC бизнес-логики нет вообще, а вместо этого вызывается нужный класс для сущности.
Содержание
Что такое композиция и зачем она нужна?
ABAP-реализация OData_v2-операций через ООП-композицию
Массовое создание и обновление сущности (batch-request) (дополнение к CUD)
Реализация 2-ой сущности на основе композиции на основе созданных классов
Настройка параллельности при обработке batch-request
Реализация QUERY-options для GET_ENTITY_SET
Реализация Navigation Properties для Expand and Deep Insert
Для начала вспомним, что такое композиция и в чем ее преимущества, а также, что говорит на этот счет SAP; затем на этой основе реализуем 3 сущности: Variable ID, Variable Value и Variable Change Log.
Что такое композиция и зачем она нужна?
Композиция – это отношение между объектами (связь между объектами) «часть-целое». Особенность в том, что объект существует только как часть основного объекта.
В нашем случае из преимуществ композиции: расширяемость/масштабируемость и тестируемость.
Чтобы лучше понять определение рассмотрим другие виды связей между объектами.
Рис. 1 Пример связей между объектами на языке UML (http://www.uml.org)
Поясним эту UML-диаграмму. В верхнем блоке (жирный шрифт) обозначается название класса или интерфейса. Если класс абстрактный, то обозначается курсивом; для пометки интерфейса – лучше вносить слово <<interface>>. В блоке посередине обозначаются атрибуты класса/интерфейса. Значки в начале обозначают область видимости.
Символ «+» обозначает Public (видимый).
Символ «#» (октоторп / решетка) обозначает Protected (Защищенный).
Символ «-» обозначает Private (скрытые).
Затем обозначается имя атрибута и через двоеточие его тип.
Взаимосвязи между объектами
1. Зависимость
Изменение класса (без стрелочки) может повлиять на класс со стрелочкой.
Изменение класса CL_GUI_ALV_GRID может повлиять на изменение на нашей программы ALV-отчета; но наоборот – нет.
Символ:
2. Ассоциация
Связь между объектами модели, которая описывает набор связей, существующих между объектами. Ассоциация показывает, что объекты одной сущности связаны с объектами другой сущности.
[наша выборка данных] и [alv-представление]
Символ:
3. Агрегация
Это разновидность ассоциации при отношении между целым и его частями.
Отношение контейнер и содержимое. По сути – коллекция других объектов.
Пример: списки. Список настроек, разработок, контактов.
Если список удалить, то сами объекты настроек, разработок, контактов (люди) – останутся.
Символ:
4. Композиция (вот что нам нужно в ABAP) – более строгий вариант агрегации. Форма агрегации с четко выраженным отношением владения и совпадением времени жизни частей и целого. Если контейнер будет удален и то и объекты в нем будут удалены.
Символ:
Обозначает отношение композиции. То есть атрибут в одном классе имеет другой тип, и линия ведет к этому типу.
5. Обобщение / Наследование (Generalization) – показывает отношение, при котором потомок строится по спецификации обобщенного элемента (родителя).
Символ:
6. Реализация – это отношение между элементами модели, в котором один элемент (клиента) реализует поведение, заданное другим (поставщиком). Реализация – это отношение часть-целое.
Поставщик, как правило, является абстрактным классом или интерфейсом.
Символ:
Также в UML могут использоваться Заметки (Notes).
В ООП-паттернах, рекомендацией является использование композиции вместо наследования.
ABAP-реализация OData_v2-операций через ООП-композицию
Реализуем OData сервис, но уже немного с другим подходом, а также с массовыми операциями.
Для 1-ой сущности – создадим структуру ZSWA003_VAR_H2_SRV на основе таблицы ZTWA001_VARID.
Идем в транзакцию SEGW и создаем проект ZWEB_ABAP_DEMO3.
Выбираем Import -> DDIC Structure:
Укажем имя сущности VarH и ссылку на структуру:
Добавим все поля как есть и нажмем Next:
Обозначим поле Namе в качестве ключевого поля. Описание в столбцах Name и Label оставим как есть. По завершению нажимаем Finish.
По итогу система создаст проект с сущностью:
Затем сгенерируем сервис (на данном шаге в первый раз) и тем самым создадим нужные классы.
Подтверждаем классы и тем самым создаем их (указываем запрос, если нужно).
После начальной генерации сервиса – зарегистрируем его через транзакцию /IWFND/MAINT_SERVICE - Activate and Maintain Services.
На экране заполняем поля (как на скрине) и нажимаем Get Services.
Выделяем нужный сервис и нажимаем Add Selected Services.
Система предложит имя сервиса; делаем подтверждение ввода, обращая внимание на пакет.
После указания запроса должно появиться сообщение, как ниже:
Возвращаемся в транзакцию SEGW в созданный проект и идем в класс ZCL_ZWEB_ABAP_DEMO3_DPC_EXT.
Правой кнопкой мыши щелкаем по ID класса и выбираем Go to ABAP WorkBench.
Реализовываем метод конструктор:
Код метода CONSTRUCTOR:
method CONSTRUCTOR. super->constructor( ). endmethod.
Также переопределяем метод VARHSET_GET_ENTITYSET.
В методе пишем код (временный) для проверки работоспособности сервиса как такового.
После вставки кода и активации, переходим в транзакцию /IWFND/GW_CLIENT - SAP Gateway Client. И проверяем service document, service metadata и GetEntitySet.
Все успешно работает. Теперь перейдем в Eclipse и преобразуем код, чтобы сама выборка происходила в отдельном классе.
По факту мы хотим реализовать следующую схему.
Рис. 2 UML-схема для OData_in-параметра
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти