DDD为不同的上下文边界保存“相同”实体

时间:2009-05-05 22:12:08

标签: domain-driven-design

这只是一个例子。

假设您有2个实体用于2个不同的上下文边界。第一个上下文是SkillContexter,实体是'Player'并且有3个属性:Id,Name和SkillLevel。在其他上下文(Contactcontext)中,实体是“播放器”并具有3个属性:Id,Name和EMail。

如何将这些实体持久保存到数据库中?我只想要一个表(Player)而不是两个表(PlayerContact,PlayerSkill)。我是否有两个不同的存储库用于保存不同的上下文实体,但是在同一个表中?或者我是否有一个“主”玩家实体,其中包含我需要保存的所有属性,以便创建一个名为PlayerMaster的新实体,它具有4个属性:Id,Name,EMail和SkillLevel?

第一个解决方案为我提供了更多的存储库,第二个解决方案让我创建了一个“技术”实体,其唯一目的是将数据保存到数据库中,这感觉非常错误,或者是否有一个我错过的更好的解决方案?

你们是怎么解决的?

2 个答案:

答案 0 :(得分:5)

当我第一次使用DDD时,我也在使用Context + Domain + Module + Model组织的东西。

DDD确实是构建域模型的指南。一旦我停止尝试对我的上下文和边界进行子组织,并开始考虑实体之间真正共享的东西 - 事情开始更好地融合在一起。

我实际上不使用上下文,除非它是一个完全不同的应用程序(app = context)。只是我的偏好。但是,我确实拥有仅在代码(IRepository,IComponent等)中共享基本摘要和接口的模块。问题是,DDD说模块可以在模块之间共享实体 - 但是,只是在非常有限的范围内(你真的不想经常这样做)。

考虑到这一点,我会放弃使用上下文并转向“我真正想要完成的事情,这些模型有什么共同点。”这就是我想的,读你的问题(如果我理解的话)它们)。

Person() is a base entity.  It has ID and Name.

PlayerSkill() is a Value Object, that is 
accessable from Person().PlayerSkill.

Contact() is an entity that inherits Person(), 
so it inherits ID and Name, and has additional Contact properties you want.

现在,我只是撕毁了你的域名。我知道。

你也可以使用hybird方法:

Person() is a base entity.  It has ID and Name.

Player() inherits Person(), applies Skill()
and other VOs.

Contact() inherits Person(), applies Address()
and other VOs.

答案 1 :(得分:0)

我不太清楚你的上下文界限是什么意思,所以我的答案可能已经结束了。

两个玩家实体是否代表相同的物理实体(人)?如果是这样,那么我将创建一个具有所有四个属性的单个Player实体,并将它们的数据存储在一个表中。