我有两个实体Publisher和SocialAccount。SocialAccount包含多个帐户,如Twitter、Facebook等。
1个发布者可以附加到多个社交帐户,并且1个社交帐户包含多个发布者,此社交帐户还与另一个实体活动连接。我的意思是两者都是独立的实体。
在创建publisher实例时,不需要订阅社交账号,可以在后续阶段订阅。
我需要订阅一个或多个社交帐户的发布者。我该怎么做呢?
如何将发布者和社交帐户之间m对m关系转换为一对多关系。我不确定,因为我在很多地方读到,我们应该避免实体之间的M到M关系。
发布于 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。
在您使用SocialAccount和Publisher的情况下,我建议在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;
}
}(此示例使用类似于Jimmy Bogard's Wicked Domain Models的域封装。)
请注意,我选择Publisher作为聚合根,因为SocialAccount可以独立存在,但是如果没有SocialAccount,Publisher就没有意义。
还要注意,我传递的是唯一的I,而不是对对象本身的引用。这是DDD中的一种常见方法,允许延迟加载相关实体,尽管代价是当您想要访问实体时,您必须调用存储库来获取实体。
这种方法还意味着您不会将所有的SocialAccount都作为一个枚举。它们被拆分到不同的Publisher中。要获得所有SocialAccount的列表,需要单独的查询。
https://stackoverflow.com/questions/4366102
复制相似问题