所以,我决定学习DDD,因为它似乎解决了我一直面临的一些架构问题。虽然有很多视频和示例博客,但我没有遇到过一个指导我解决以下场景的问题:
假设我有实体
void *thread_fucntions(void *arg)
^^
我的问题是:假设这将被转换并提供给MVC视图,并且用户想要更新AlternatePhone,电子邮件以及对于给定的有界上下文而言存在于此实体中的许多其他属性(不是为简洁起见)
我知道正确的指导是为每个操作设置一个方法,但是(我知道它的反模式的KINDA)我无法帮助,但是想知道这是不会最终触发数据库上的多个更新调用。
这是如何处理的?在某个地方,是否会有一些东西可以将我的EventOrganizer映射到某些东西 - 例如DbEventOrganizer并收集对域实体所做的所有更改并一次性应用这些更改?
答案 0 :(得分:7)
DDD更适合基于任务的UI。你所描述的是非常CRUD的。在您的情况下,单个属性被视为独立的数据字段,其中一个或多个可以通过单个通用业务操作(更新)进行更新。
如果您希望成功使用DDD,则必须对您的域进行更深入的分析。
为什么有人会一起更新所有这些字段?用户试图实现的隐式业务操作是什么?是否通过一起更改PrimaryPhone
,AlternatePhone
和Email
来表达更具体的业务流程?
也许这会改变ContactInformation
的{{1}}?如果是这种情况,那么您可以在EventOrganizer
上为单个ChangeContactInformation
操作建模。然后,您的UI将发送EventOrganizer
命令而不是ChangeContactInformation
命令。
至于聚合根(AR)的持久性,如果你使用的是RDBMS,这通常由像NHibernate这样的ORM来处理。但是,还有其他方法可以将事件源,NoSQL数据库甚至storing JSON或RDBMS中的任何其他数据交互格式等AR保留在其中。
答案 1 :(得分:2)
你的问题非常广泛!
EventOrganizer本身不应该更新任何东西。您应该将更新代码与实体完全分开。另一个类将采用EventOrganizer对象并更新数据库。这被称为“持久性无知”,使代码更加模块化和有凝聚力。
创建一个视图模型是很常见的 - 一个类的目的是以所需的确切形式为View提供所需的确切数据。您需要从EventOrganizer创建视图模型,之后View可以以编程方式或绑定方式更新它。当您准备保存更改时,您需要从View Model更新EventOrganizer并将其传递给更新程序。这似乎是项目小而简单时不需要的层,但随着复杂性的增加,它变得无价。