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

Mag*_*adh 4 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?

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

你们是怎么解决的?

edu*_*911 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.
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用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.
Run Code Online (Sandbox Code Playgroud)