Domain driven design 域驱动设计-从UI增量保存
我是DDD的新手,阅读有关DDD的文献,但在应用某些概念时遇到困难。 我正在演示我正在构建的应用程序的简化视图。这是一个住房贷款申请系统。用户界面有类似向导的步骤来收集信息,如步骤1是收集申请人信息,步骤2是收集财产信息,步骤3是捕获批准或拒绝的决定。在步骤1,每个应用程序都会被分配一个唯一的ID。我的挑战是如何对每个步骤的增量存储进行建模。 贷款申请是我的总根。从我所读到的内容来看,每个根目录只有一个存储库,整个根目录必须保存在一起才能有效。然而,UI以增量方式收集信息,并且在每个步骤中,应用程序实体都是有效的—当我保存步骤1中的数据时,我的贷款应用程序对象是有效的。保存步骤2中的数据时,贷款申请对象仍然有效。 在这里寻找一些关于如何设计Api和存储库的建议?如果agg root在每一步都有效,并且可以在小步中保存,那么公开一个save api有什么意义?是否应该有3个单独的Api向UI公开,并且这3个Api调用3个单独的repo类,或者1个Api调用一个repo上的3个单独方法?我正在使用实体框架保存到数据库。Domain driven design 域驱动设计-从UI增量保存,domain-driven-design,Domain Driven Design,我是DDD的新手,阅读有关DDD的文献,但在应用某些概念时遇到困难。 我正在演示我正在构建的应用程序的简化视图。这是一个住房贷款申请系统。用户界面有类似向导的步骤来收集信息,如步骤1是收集申请人信息,步骤2是收集财产信息,步骤3是捕获批准或拒绝的决定。在步骤1,每个应用程序都会被分配一个唯一的ID。我的挑战是如何对每个步骤的增量存储进行建模。 贷款申请是我的总根。从我所读到的内容来看,每个根目录只有一个存储库,整个根目录必须保存在一起才能有效。然而,UI以增量方式收集信息,并且在每个步骤中,应用
谢谢。应用程序的要求和建模方式将影响您的工作方式 (注意:我将使用AR作为聚合根) 在您的情况下,如果您有贷款申请卡,则需要包含有关申请人和属性的信息 假设每个申请人都有一个类似于唯一账户的账户,因此您可以跟踪一个申请人拥有多少贷款 在这种情况下,申请人将是一个实体,可能是一个AR。它将拥有自己的存储库:applicationrepository。在这种情况下,申请人AR需要从您的贷款申请AR中引用 这意味着在向导的第一步中,您可以使用applicationrepository搜索申请者,或者创建一个新的申请者。如果要创建一个新的,您可以在第一步创建并保存它。稍后,您可以从贷款应用程序中引用申请人(通过引用或ID) 如果您不希望这样做,那么申请人可以是一个值对象,其信息将存储在加载应用程序AR中 同样的情况也适用于属性:您可以将属性实体与属性存储库一起使用,也可以将属性信息值对象存储到加载应用程序AR 另一件重要的事情是,你厌恶应用程序有一个生命周期。根据它的当前状态,它的不变量可能会更改。有一个将经历不同阶段的AR是可以的。以网上商店为例。比如说,当你从亚马逊订购商品时,你的订单可能会被批准或待定(或在其他州),这是其生命周期的一部分。当您想要完成订单时,系统可能会在提交之前要求您提供付款详细信息 在您的ca中,您可以通过以下状态为LoadApplication创建生命周期:挂起、提交审批、批准、拒绝等。还可能需要有关拒绝原因等的其他信息 如果要保存有关创建LoadApplication过程的信息,可以指定一个状态,表示您LoadApplication仍在创建过程中:挂起或正在进行。这样,如果您的应用程序在中间崩溃,则可以通过获取<强> Load应用程序< /强>并检查其状态来恢复。 您可以在LoadApplication AR中添加与其状态相关的行为(例如,如果未处于SubmittedForApproval状态,则不允许转换为Approved状态;如果未处于InProgress状态,则不允许更改属性(当状态为Approved或SubmittedForApproval时,您不希望更改属性或申请人) 实施保存: 如果您已确定LoadApplication聚合将包含三个实体:LoadApplication、申请人和属性,则所有这些实体都将一起保存和加载,因为聚合是一个事务边界。此指南有助于implementing保存,但这可能很棘手 这将取决于几个因素:
- 您的数据库是什么(SQL、MongoDB)
- 您是使用框架(NHibernate、Mongoose)还是使用本机API(使用原始SQL)