2009-05-05 100 views
4

这只是一个例子。DDD为不同的上下文边界保存“相同”实体

假设您有2个实体用于2个不同的上下文边界。第一个上下文是SkillContexter,该实体是“玩家”并具有3个属性:Id,Name和SkillLevel。在另一个上下文(Contactcontext)中,实体是“玩家”并具有3个属性:Id,Name和EMail。

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

第一个解决方案给了我更多的存储库,第二个解决方案使我成为一个“技术”实体,只有目的是将数据保存到数据库,这感觉真的错了,还是有更好的解决方案,我错过了?

你们是怎么解决它的?

回答

0

我不太清楚你的意思的上下文边界,所以我的答案可能是关闭的。

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

5

当我第一次开始使用DDD时,我也与事物的上下文+域+模块+模型组织摔跤。

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. 
相关问题