Что такое чистый способ объединить объекты домена с объектами уровня без Поддержка ORM-фреймворка?Доменные классы/объекты с чистым уровнем устойчивости (DAOs, Factoryories, ...)
У меня есть Доменные классы/сущности zcl_document
и zcl_document_request
(1: n). Я хочу, чтобы классы домена содержали только основную логику домена, no инфраструктура, нет «помощников», нет механизмов настойчивости/загрузки.
Будучи в ABAP, я определил «чистый» structures
zs_document
и zs_docreq
для каждого объекта, которые подвергаются как общественному-только для чтения data
атрибута (мы в ABAP в конце концов). Таким образом, мне не нужна куча геттеров на сущности и минимизация методов для основной логики домена.
Чтобы получить тонкий Постоянство-слой, я определил DAO
-интерфейс, который read
, save
и find_by_x
для каждой базы данных таблицы (в том числе дополнительного текста стола и прочее). Их возвращаемым типом всегда является structure
или таблица структуры, не объект объекта. Поэтому у меня есть тестовый/заменяемый тонкий слой persistence. Этот уровень настойчивости теперь также можно использовать в отчетах, которые обрабатывают массовые данные, потому что я не вынужден создавать объекты-экземпляры или графики объектов, я могу прибегнуть к работе с (надеюсь, чистыми) структурами.
Чтобы создать экземпляр объекта, обычно каждый объект имеет общедоступный статический метод create
(фабричный), который принимает «чистую» структуру, проверяет и создает свой экземпляр. Объектам, которые имеют фундаментальные ассоциации с другими объектами, сложнее create
, так как также необходимо создать зависимые объекты. Эти лица получают свои zcl_document_request_manager
(несут именование). Менеджер знает, как create
(заводская) и save
объект, включая все связанные объекты. Следовательно, это также friend
объектов.
Заводы - это единственные места, которые знают DAO, чтобы сохранить сущности сами по себе от объектов инфраструктуры/стойкости. Загрузка выполняется с нетерпением, я не знаю, как создать прозрачную ленивую загрузку, не имея слишком большого кода управления инфраструктурой в сущности.
Работа с ним будет выглядеть следующим образом:
create object lo_docreq_mng exporting dao, dao, dao, dao,...
lt_docreq = docreq_dao->find_by_x(...) // table of structure
foreach lt_docreq as ls_docreq // structure
lo_docreq = lo_docreq_mng=>create(ls_docreq) // factory => instance
lo_doc = lo_docreq->get_document() // was created with document-instance
lo_docreq->do_something_mutating().
lo_docreq_mng->save(lo_docreq) // save including dependent objects
ли это возможно, или есть какой-то запах? Любой комментарий оценен.
В чем причина не использования существующего ORM в ABAP, который, насколько я понимаю ваш запрос, уже покрывает большую часть необходимого вам материала? – vwegert
Я думаю, что упорные классы уродливы и генерируют тонны get/set. Я не хочу иметь классы, сильно привязанные к постоянству. Вместо этого я бы хотел получить несколько чистых доменных классов с тонким уровнем стойкости, если это возможно ... – hotzen
«Я думаю, что упорные классы уродливы» - ну, я так не думаю, и это было бы концом этого если у вас нет серьезных проблем :-) – vwegert