Я пытаюсь следовать принципам DDD для моего текущего проекта.К сожалению, мне приходится использовать RFC из-за технических ограничений, поэтому нет OData и REST.Это довольно длинный вопрос, я надеюсь, что это нормально - задавать это в Stackoverflow.
В любом случае у меня есть класс сущности WorkOrder со списком объектов Operation.
У меня есть класс WorkOrderRepository сметод SAVE, который получает только объект WorkOrder и способен сохранять все (данные заголовка, адрес и т. д.) за один раз.Неважно, если это создание, обновление или удаление.Хранилище скрывает вызовы BAPI от остальных.
Теперь я хочу реализовать логику добавления / обновления / удаления операций к объекту рабочего задания, и я не уверен, даже если имена, которые я даю методамверны.Может быть, их следует вставить / отредактировать / удалить ... Я смущен этим, потому что в каждом месте, где я смотрю, используются разные имена.
Но наиболее важны мои два конкретных сомнения:
- Должен ли я иметь только 1 RFC, который получает все обновления сущности WorkOrder, включая заголовок, операции?Или я должен создать 1 RFC на операцию, которая обрабатывает только одну операцию за раз?Имейте в виду, что макет пользовательского интерфейса ожидает, что пользователь может добавить / удалить несколько операций перед нажатием кнопки SAVE, а RFC имеет неявную фиксацию, и что, насколько мне известно, сущность DDD должна обновляться всегда за один вызов.
Вариант 1:
FUNCTION ZWORKORDER_HDR_UPD
IMPORTING
VALUE(I_WORKORDER_ID) TYPE AUFNR
VALUE(I_WORKORDER_HDR_CHG) TYPE ZWORKORDER_HDR_CHG
VALUE(I_WORKORDER_HDR_UPD) TYPE ZWORKORDER_HDR_UPD "X structure for the BAPI
VALUE(I_OPERATIONS_CHG) TYPE ZOPERATIONS_CHG
VALUE(I_OPERATIONS_UPD) TYPE ZOPERATIONS_UPD
VALUE(I_OPERATIONS_DEL) TYPE ZOPERATIONS_DEL
EXPORTING
VALUE(E_ERRORS) TYPE BAPIRET2_T.
Вариант 2
FUNCTION ZWORKORDER_OPERATION_CRT
IMPORTING
VALUE(I_WORKORDER_ID) TYPE AUFNR
VALUE(I_OPERATION) TYPE ZOPERATION_CHG
EXPORTING
VALUE(E_ERRORS) TYPE BAPIRET2_T.
FUNCTION ZWORKORDER_OPERATION_UPD
IMPORTING
VALUE(I_WORKORDER_ID) TYPE AUFNR
VALUE(I_OPERATION_CHG) TYPE ZOPERATION_CHG
VALUE(I_OPERATION_UPD) TYPE ZOPERATION_UPD
EXPORTING
VALUE(E_ERRORS) TYPE BAPIRET2_T.
FUNCTION ZWORKORDER_OPERATION_DEL
IMPORTING
VALUE(I_WORKORDER_ID) TYPE AUFNR
VALUE(I_OPERATION_ID) TYPE ZOPERATION_ID
EXPORTING
VALUE(E_ERRORS) TYPE BAPIRET2_T.
Как должны выглядеть методы Workorder для этого?Меня особенно смущает метод update, поскольку я не уверен, должен ли я сначала получить существующую операцию, а затем обновить ее или позволить родительскому классу сделать это.Но, возможно, мои подходы совершенно неверны от корня.
Вариант 1:
workorder->add_operation( i_operation ). "Pass flat structure from RFC? Or first create object?
workorder->update_operation( i_operation_chg
i_operation_upd ).
workorder->delete_operation( i_operation_id ).
Вариант 2:
workorder->add_operation( ).
operation = workorder->get_operation(i_operation_chg->get_id())
operation->update( i_operation_chg
i_operation_upd ).
operation->delete_operation( i_operation_id ).