Позвольте мне расширить ответ Дона, как я думаю, что он ведет вас на верном пути.
Отношения M-to-N являются естественными, полезными и могут обрабатываться в DDD. Если вам требуется отношение M-to-N, вам не нужно пытаться преобразовать его в (или, скорее всего, несколько) отношений M-to-1. Udi Dahan's acticle дает хороший пример того, как обрабатывать отношения M-to-N между объектами.
Сначала определите, какой объект должен содержать список идентификаторов другого. Udi использует пример сообщений о вакансиях (Job
) и доски объявлений (JobBoard
). Поскольку работа может существовать без совета по трудоустройству, и плата за работу не может существовать без заданий, JobBoard
выбирается как совокупный корень и будет содержать List<Job>
. Это может показаться отношением M-to-1, но поскольку каждый Job
может быть в списке для нескольких JobBoard
s, это действительно M-to-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
может существовать сам по себе, но Publisher
не имеет смысла без существования SocialAccount
.
Также обратите внимание, что я пропускаю уникальные идентификаторы, а не ссылки на сами объекты. Это общий подход в DDD и допускает ленивую загрузку связанных объектов, хотя компромисс заключается в том, что вам нужно вызвать репозиторий для получения объектов, когда вы хотите получить к ним доступ.
Этот подход также означает, что у вас нет всех SocialAccount
s как единственное перечисление. Они разделены между различными Publisher
с. Для получения списка всех SocialAccount
s потребуется отдельный запрос.
Ваш вопрос о кодировании самих объектов или о том, как сохранить объекты в базе данных? Если вы просто говорите об объектах, то просто измените SocialAccount на то, что у коллекции издателей есть ссылка на один Publisher. – David 2010-12-06 12:02:59
Я смущаюсь на обоих.Издатель не является совокупным корнем социальной учетной записи. Как я буду упорствовать тогда. – chandra 2010-12-06 13:24:29
Мне нужно знать, как в DDD обрабатываются отношения. И от одного до многих, и от многих до многих, В тех же агрегатах и в разных агрегатах. В Интернете такой информации нет. Я googled alot – chandra 2010-12-06 13:26:41