Domain driven design 域驱动设计-从UI增量保存

Domain driven design 域驱动设计-从UI增量保存,domain-driven-design,Domain Driven Design,我是DDD的新手,阅读有关DDD的文献,但在应用某些概念时遇到困难。 我正在演示我正在构建的应用程序的简化视图。这是一个住房贷款申请系统。用户界面有类似向导的步骤来收集信息,如步骤1是收集申请人信息,步骤2是收集财产信息,步骤3是捕获批准或拒绝的决定。在步骤1,每个应用程序都会被分配一个唯一的ID。我的挑战是如何对每个步骤的增量存储进行建模。 贷款申请是我的总根。从我所读到的内容来看,每个根目录只有一个存储库,整个根目录必须保存在一起才能有效。然而,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个单独方法?我正在使用实体框架保存到数据库。
谢谢。

应用程序的要求和建模方式将影响您的工作方式

(注意:我将使用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)

由于只有LoadApplicationRepository将使用Appender属性保存LoadApplicationRepository,因此即使将Appender再次保存到数据库中也没有问题,因为不会对其进行任何更改。您将仅使用相同的数据覆盖现有数据,对于性能来说不是很酷,但这与您的逻辑无关

另一方面,如果您使用的是ORM,则它们可以检测对象中的更改,并仅生成所需的查询以仅更新数据库中的新更改。在这种情况下,如果您说将属性添加到LoadApplication,则if将拾取该属性并仅更新数据库中的属性

例如,假设您将SQL数据库与(N)Hibernate或EntityFramewok一起使用,则您的ORM将跟踪添加的属性所做的更改