ORM フレームワークをサポートせずに、ドメイン オブジェクト/エンティティを永続レイヤーと組み合わせるクリーンな方法は何ですか?
ドメインクラス/エンティティzcl_document
とzcl_document_request
(1:n) があります。ドメインクラスには、コアドメインロジックのみを含め、インフラストラクチャ、「ヘルパー」、永続性/読み込みメカニズムを含めないようにしたいと考えています。
ABAPにいるので、「クリーン」を定義structures
zs_document
し、パブリック読み取り専用属性zs_docreq
として公開される各エンティティに対して定義しました(結局、ABAPにいます)。data
このようにして、エンティティに多数のゲッターを必要とせず、コア ドメイン ロジックへのメソッドを最小限に抑えます。
薄い永続レイヤーを取得するために、各データベース テーブル (オプションのテキスト テーブルなどを含む) に対して -interfaces which を定義しましDAO
たread
。それらの戻り値の型は、エンティティ オブジェクト自体ではなく、常にまたは構造のテーブルです。したがって、テスト可能/交換可能な薄い永続層があります。この永続層は、大量のデータを処理するレポートでも使用できるようになりました。これは、オブジェクト インスタンスやオブジェクトのグラフを作成する必要がなく、(できればクリーンな) 構造で作業することに頼ることができるためです。save
find_by_x
structure
エンティティをインスタンス化するために、通常、各エンティティには public-static create
(ファクトリ) メソッドがあり、「クリーンな」構造を取り、そのインスタンスを検証して生成します。create
依存オブジェクトも作成する必要があるため、他のオブジェクトへの基本的な関連付けを持つエンティティは、より困難です。それらのエンティティは独自のものを取得しますzcl_document_request_manager
(名前を付けます)。create
Manager は、関連するすべてのオブジェクトを含む方法(ファクトリ) とsave
エンティティを知っています。したがってfriend
、エンティティの 1 つでもあります。
ファクトリは、エンティティ自体をインフラストラクチャ/永続性のものからクリーンに保つために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
これは実現可能ですか、それとも臭いがありますか?コメントをいただければ幸いです。