在没有ORM 框架支持的情况下,将域对象/实体与持久层结合起来的干净方法是什么?
我有域类/实体zcl_document
和zcl_document_request
(1:n)。我希望域类只包含核心域逻辑,没有基础设施,没有“助手”,没有持久性/加载机制。
structures
zs_document
在 ABAP 中,我zs_docreq
为每个公开为公共只读data
属性的实体定义了“干净”(毕竟我们在 ABAP 中)。这样我就不需要实体上的一堆吸气剂,并将方法最小化为核心域逻辑。
为了获得一个薄的持久层,我为每个数据库表(包括可选的文本表和东西)定义了DAO
-interfaces whichread
和。它们的返回类型始终是结构的或表,而不是实体对象本身。所以我有一个可测试/可替换的薄持久层。这个持久层现在也可用于进行海量数据处理的报表,因为我不必被迫创建对象实例或对象图,我可以求助于(希望是干净的)结构。save
find_by_x
structure
为了实例化一个实体,通常每个实体都有一个公共静态create
(工厂)方法,该方法采用“干净”结构,验证并生成其实例。与其他对象具有基本关联的实体更难create
创建,因为也必须创建依赖对象。这些实体有自己的zcl_document_request_manager
(承担命名)。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
这是可行的还是有一些气味?任何评论表示赞赏。