Использование общих идентификаторов среди связанных между собой доменных агрегатов

Разумно ли использовать общие идентификаторы 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 Совместное использование одного и того же значения для всех лиц не плохо.

Другие вопросы по тегам