在使用域驱动设计时,为不同项目共享模型的最佳实践是什么?

时间:2011-11-02 20:58:32

标签: domain-driven-design

因此,我们可以将域驱动设计应用于多个项目,但可能存在相同的域模型的交集。

在这种情况下,如何应用域驱动设计(使用ORM,模型优先,生成数据库模式)?使用大量相同的表创建多个数据库?或者如何共享数据?用同义词?解决共享模型(包括数据)的可能策略是什么?

欢迎任何建议。提前谢谢!

2 个答案:

答案 0 :(得分:1)

在我之前的项目中,我们讨论过在多个具有共享部分的模型中使用冗余信息。

我们发现有趣的是,我们认为几个项目(不是C#proj,但是真正的大型开发项目)或者称之为系统很少共享关于如何使用模型的完全相同的观点。我们认为,在跨越多个应用程序/系统/项目的更大域中,您可以发现几个核心,您不希望在每个应用程序中复制核心。

这一切都以一个分布在多台机器上的域结束。我们有GUID键将它们绑定在数据库中。但是,由于我们这样做了“模型优先”,子域名就像通过域事件到达的基础设施相关服务一样相互看待。

复杂?并不是的。这是一个例子: 域名(薪酬审核系统) - 我们有一个薪资审核统计系统,对员工薪水及其经历,年龄和表现的评估进行评估。核心是问卷形式,工作评估,问卷答案,评级。薪酬改革建议等。

域名2(员工系统) - 在这里您管理员工,注册新员工,处理康复,个人发展,工资,员工合同,员工福利等。

域名三(绩效管理) - 在此处理员工经验,目标,成就以及老板和员工之间关于个人发展,评级和绩效等级的协议的历史。

当您注意到每个域的核心不同但他们有一些共同的担忧。根据部署,基础设施以及他们应该相互关联/相互响应的要求 - 技术如何解决这个问题可能会有所不同。

我更喜欢独立完成这项技术。我们使用NServiceBus通过域事件(Udi Dahn的域事件模式)同步域。

例如,一旦我们完成了对员工的薪资审查,应告知老板,Joe应该有机会在今年加薪200-500美元。

实体聚合根上的ApplySalaryReview方法Employee不仅保存审阅结果,还触发域事件NotifySalaryReviewSubscribers,它触发应用层中的事件处理程序HandleNotifySalaryReviewSubscribersEvent,它接受ctor中的基础结构服务。该服务将结果放入消息队列中,所有需要此信息的系统都可以订阅此消息。 在我们的例子中,它是域二(员工系统)。员工系统导入结果并通知员工的老板他获得了与该特定员工即将进行的薪水谈话的新信息。

我希望我可以在某种方式上做一些事情。还有很多其他的方式......

答案 1 :(得分:0)

您可能希望(重新)阅读blue book中的战略设计模式。