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