Использование общих идентификаторов среди связанных между собой доменных агрегатов
Разумно ли использовать общие идентификаторы GUID в качестве идентификаторов агрегатов для корневых агрегатов, имеющих отношение один к одному?
Я не сразу вижу никаких причин, кроме ясности.
Например, у меня есть ограниченный контекст членства в организации, чей совокупный корень основной проблемы - это член. Агрегат участника содержит данные, относящиеся к членству, и ссылки на совокупность связанных лиц (имя, дату рождения и т. Д.) И на совокупность пользователей сайта (EF Identity).
Моя первоначальная идея состояла в том, чтобы сделать что-то вроде этого, где каждый корень агрегата содержит ссылки на связанные корни агрегата:
public class Member : AggregateRoot
{
Guid Id; // (Each aggregate ID is inherited)
Guid PersonId;
}
public class Person : AggregateRoot
{
Guid Id;
Guid UserId;
}
public class User : IdentityUser, IAggregateRoot
{
Guid Id;
}
Получение личности участника сделано с:
var person = personRepository.GetById(member.PersonId);
Тогда мне пришло в голову, что я могу "упростить" вещи, если я просто использую один и тот же идентификатор для Member, Person и Username, а затем получу связанные агрегаты, используя, например:
var person = personRepository.GetById(member.Id)
Это лишь незначительная разница, и я был изначально доволен этой идеей, но теперь я начинаю настороженно относиться. Это плохая идея, поскольку она затеняет отношения?
1 ответ
Вы могли бы сделать это, но вы сделали бы явное неявное, что плохо. Тот факт, что эти объекты используют один и тот же идентификатор, будет скрыт, только в службах Приложений будет найдено это знание. Такое ощущение, что знание предмета просачивается наружу. Кроме того, связь между ограниченными контекстами скрыта, вы не будете знать, что находится вверх по течению, а что вниз по течению. Временная зависимость также теряется: то, что создается первым, Person
или User
?
Если вам нужно узнать об этом, просто поищите в предпочитаемой вами поисковой системе "сделать явную явную разработку программного обеспечения". На всякий случай, если ваши результаты отличаются, вы должны прочитать это.
PS Совместное использование одного и того же значения для всех лиц не плохо.