DDD - Репозиторий и отношения многие ко многим - PullRequest
2 голосов
/ 10 августа 2011

Я новичок в DDD, и я застрял здесь: у меня есть отношения многие ко многим между двумя объектами: пользователем и группой.Отношение не является совокупным, поскольку пользователь может существовать без группы, а группа может существовать без пользователя.

Это мой код для класса пользователя:

public class User {

    private List<Group> groups = new ArrayList<Group>();

    private UserRepository userRepository;

    public void create() throws Exception{
        userRepository.create(this);        

        // I have to update the groups with the user.
        for (Group group : groups) {
            group.update();
        }
    }

     public void addGroup(Group group){
        if (!groups.contains(group)) {
            groups.add(group);
            group.addUser(this);
         }
    }
}

Проблема заключается в том, чтоЯ не знаю, где связать эти классы, когда я создаю пользователя, в котором есть группы (я не могу использовать ORM).Я сделал это в методе создания User, а также управлял транзакциями там через Spring.Это правильно?Или я должен поместить этот код в репозиторий пользователя или в службу?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 августа 2011

Я сделал это в методе создания User, а также управлял транзакциями там через Spring. Это правильно?

Правильность этой логики будет зависеть от того, как написано хранилище и каков его контракт. Если в хранилище не сохранятся какие-либо отношения, то это может быть признаком плохо спроектированного хранилища. Я ожидаю, что в хранилище будет реализована необходимая логика для хранения ассоциаций сущностей, а не только простых свойств сущности.

Репозиторий, основанный на решении ORM, упростил бы это за счет каскадирования постоянных событий, но в вашем случае это может привести к дублированию кода в обоих ваших репозиториях (я предполагаю, что у вас есть GroupRepository также). Возможно, будет лучше, если вы решите, какой сущности принадлежит отношение, а затем сохраните связь в соответствующем хранилище. Поэтому любые изменения в ассоциации должны вносить только те лица, которые владеют ассоциацией (в вашем случае это User, и, как следствие, UserRepository должен управлять ассоциацией).

0 голосов
/ 11 августа 2011

Согласно книге Эрика Эванса, многие ассоциации делают вашу модель слишком сложной. Попробуйте заменить их на 2 многозначных ассоциации. Одна часть ассоциации «многие ко многим» всегда имеет больше стоимость бизнеса, чем другие.

В вашем случае я бы остановился на 2 агрегатах - User и Group, где User агрегат отвечает за хранение группы GroupReferences.

0 голосов
/ 10 августа 2011

Лукас, я бы:

1) Создайте фабрику пользователей, которая может принимать группы, которые должны быть связаны с новым пользователем. Фабрика может использовать метод addGroup для создания этой ассоциации.

2) Удалите вашу ссылку на UserRepository из класса User.

...