首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ddd中的多对多关系

ddd中的多对多关系
EN

Stack Overflow用户
提问于 2010-12-06 19:53:11
回答 1查看 10.1K关注 0票数 12

我有两个实体Publisher和SocialAccount。SocialAccount包含多个帐户,如Twitter、Facebook等。

1个发布者可以附加到多个社交帐户,并且1个社交帐户包含多个发布者,此社交帐户还与另一个实体活动连接。我的意思是两者都是独立的实体。

在创建publisher实例时,不需要订阅社交账号,可以在后续阶段订阅。

我需要订阅一个或多个社交帐户的发布者。我该怎么做呢?

如何将发布者和社交帐户之间m对m关系转换为一对多关系。我不确定,因为我在很多地方读到,我们应该避免实体之间的M到M关系。

EN

回答 1

Stack Overflow用户

发布于 2014-08-09 04:27:37

让我扩展一下Don的回答,因为我认为他正在引导您走上正确的道路。

M-to-N关系是自然的、有用的,并且可以在DDD中处理。如果您需要M- to -N关系,则不需要尝试将其转换为(或更可能是多个) M- to -1关系。Udi Dahan's acticle提供了一个很好的例子来说明如何处理实体之间的M- to -N关系。

首先,确定哪个实体应该包含另一个实体的ID列表。Udi使用了职位发布(Job)和职位发布板(JobBoard)的例子。由于作业可以在没有作业板的情况下存在,而作业板不能在没有作业的情况下存在,因此选择JobBoard作为聚合根,并将包含一个List<Job>。这看起来像是一种M对1的关系,但是,由于每个Job可以在多个JobBoard的列表中,所以它实际上是M对N。

在您使用SocialAccountPublisher的情况下,我建议在C#中使用如下代码:

代码语言:javascript
运行
复制
public class Publisher
{
    public int ID {get; private set;}
    
    private readonly IList<int> _AssignedSocialAccounts = new List<int>();
    public IEnumerable<int> AssignedSocialAccounts { get { return this._AssignedSocialAccounts; } }
    
    public Publisher(int ID) //Pass required fields to the constructor.
    {
        this.ID = ID;
    }
    
    public AssignSocialAccount(int SocialAccountID)
    {
        if(!this._AssignedSocialAccounts.Contains(SocialAccountID))
            this._AssignedSocialAccounts.Add(SocialAccountID);
    }
}

public class SocialAccount
{
    public int ID {get; private set;}
    
    public SocialAccount(int ID) //Pass required fields to the constructor.
    {
        this.ID = ID;
    }
}

(此示例使用类似于Jimmy Bogard's Wicked Domain Models的域封装。)

请注意,我选择Publisher作为聚合根,因为SocialAccount可以独立存在,但是如果没有SocialAccountPublisher就没有意义。

还要注意,我传递的是唯一的I,而不是对对象本身的引用。这是DDD中的一种常见方法,允许延迟加载相关实体,尽管代价是当您想要访问实体时,您必须调用存储库来获取实体。

这种方法还意味着您不会将所有的SocialAccount都作为一个枚举。它们被拆分到不同的Publisher中。要获得所有SocialAccount的列表,需要单独的查询。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4366102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档