DDD - 如何设计不同有界上下文之间的关联

Lao*_*jin 9 domain-driven-design aggregateroot bounded-contexts

我已经设置了一个用ORM填充的域项目.域包含不同的聚合,每个聚合都有自己的根对象.我的问题是如何处理跨越聚合边界的属性?

  • 这些属性是否应该忽略边界,以便有界上下文A中的域对象具有对上下文B中对象的引用?
  • 或者,如果没有从上下文A到B的直接链接,并且上下文A中的对象是否具有"int ContextBId"属性,该属性可用于通过B聚合根从B获取域对象?
  • 要么 ...

示例:
上下文A =用户
上下文B =游戏

Users上下文中有一个对象UserOwnedGames.此对象具有一个属性User,该属性是对同一Users上下文中的对象的引用.该对象还具有一个属性,Game该属性显然不在用户中,而是在Games上下文中.

怎么会(或应该?)这种关系是什么样的?它在数据库中很清楚(即2个外键),但代码应该是什么样的?

Mat*_*vey 15

听起来你的User上下文也需要一个Game实体.但请注意,这不一定GameGame上下文根的同一实体.这两个有界的背景可能对它是什么Game以及它具有什么属性有不同的想法.只有标识将两个Game对象绑定在一起.

User Context
{
    Aggregate Root User
    {
        Identity;
        Name;
        OwnedGames : List of Game value entities
    }

    Value Entity Game
    {
        Identity;
        Name;
    }
}

Game Context
{
    Aggregate Root Game
    {
        Identity;
        Name;
        Owner : User value entity
        HighScore : int
        TimesPlayed : int
        ... A whole bunch of other properties which are not relevant in the User context
    }

    Value Entity User
    {
        Identity;
        Name;
        // No OwnedGames property, in this context we don't care about what other games the user owns.
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在 DDD 中,对于某物“是什么”没有全局的、明确的概念,“事物”只是在某些上下文中的“事物”。 (4认同)
  • 那么如何处理跨上下文同步对同一属性的引用呢?假设我更新用户上下文中用户的 Name 属性,如何让它更新游戏上下文中用户的 Name 属性?当请求时,您是否使用 getter 来访问其他上下文?或者你有某种方法可以同步两者吗? (2认同)