什麼是將域對象/實體與持久層組合的乾淨方式沒有 ORM框架支持?具有乾淨持久層的域類/實體(DAO,工廠,...)
我有域類/實體zcl_document
和zcl_document_request
(1:n)。我希望域類僅包含核心域邏輯,基礎設施,沒有「助手」,沒有持久性/加載機制。
正在ABAP,我已經定義爲暴露作爲公共只讀屬性data
每個實體「乾淨」 structures
zs_document
和zs_docreq
(我們在ABAP畢竟)。通過這種方式,我不需要一堆實體上的getter,並最小化核心域邏輯的方法。
爲了得到一個薄持久性層,我已經定義DAO
其中γ-接口read
,save
和find_by_x
爲每個數據庫表(包括可選的文本表和內容)。它們的返回類型始終是structure
或結構表,而不是實體對象本身。所以我有一個可測試/可替換的薄持久層。這個持久層現在也可用於大量數據處理的報告中,因爲我不需要創建對象實例或對象圖,我可以使用(希望清理)結構。
要實例化實體,通常每個實體都有一個公共靜態的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
這是可行的或者是有一些氣味? 任何評論贊賞。
在我瞭解您的請求的情況下,在ABAP中不使用現有的ORM的原因是什麼?已經涵蓋了您需要的大部分內容? – vwegert
我認爲持久化類很醜,並且會產生大量get/set。我不想擁有強烈持久性的類。相反,如果可能的話,我希望獲得具有薄持久層的稍微乾淨的域類... – hotzen
「我認爲持久類很醜陋」 - 我不這麼認爲,那將是它的結束除非你有一些嚴重的問題:-) – vwegert