ddd中的多对多关系

cha*_*dra 7 domain-driven-design

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

1个发布者可以附加到许多社交帐户和1个社交帐户包含多个发布者,此社交帐户还与另一个实体活动相关联.我的意思是两者都是独立实体

创建发布者实例时,没有必要订阅社交帐户,它可以在以后订阅它.

我需要将发布者订阅到1个或多个社交帐户.我怎么做

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

小智 7

Udi Dahan就是一个例子,以及如何避免它:http: //www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/

  • Imho这篇博文没有回答这个问题 (3认同)

Jus*_*ark 7

让我扩展唐的答案,因为我认为他正带领你走上正轨.

M-to-N关系是自然的,有用的,可以在DDD中处理.如果您需要M-to-N关系,则无需尝试将其转换为(或更可能是多个)M-to-1关系. Udi Dahan的论文给出了如何处理实体之间M-to-N关系的一个很好的例子.

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

在你的情况下SocialAccountPublisher,我建议这样的事情在C#中:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

请注意,我选择Publisher成为聚合根,因为它SocialAccount可以独立存在,但Publisher没有a 的存在就没有意义SocialAccount.

另请注意,我传递的是唯一ID,而不是对象本身的引用.这是DDD中的常见方法,允许延迟加载相关实体,但权衡是您必须调用存储库以获取实体,以便访问它们.

这种方法也意味着您没有将所有SocialAccounts作为单个枚举.它们在各种Publishers 之间分开.要获取所有SocialAccounts 的列表,需要单独查询.

  • 我会说"SocialAccount"和"Publisher"都是具有自己独立生命周期的聚合根. (2认同)