Или лучше передать personRepository в
PersonEntity.update (...) и выполните поиск и проверку
метод обновления внутренней сущности?
Это не помешало бы нарушению правила через параллелизм, поскольку, как только вы проверили personRepo.usageCountOfNickname(nickname) <= 5
, оно могло измениться сразу после.
Если вам нужна строгая согласованность, вы можете ввести агрегированный корень NicknameUsage
для обеспечения соблюдения этой политики. Вы бы изменили более 1 AR в транзакции, но это, вероятно, не имеет большого значения, поскольку очень маловероятно, что в любом случае будет много споров по тем же псевдонимам, верно?
1011 * Е.Г. *
changePersonNickname(personId, newNickname) {
transaction {
person = personRepository.personOfId(personId);
currentNicknameUsage = nicknameUsageRepository.usageOfNickname(person.nickname);
currentNicknameUsage.release();
newNicknameUsage = nicknameUsageRepository.usageOfNickname(newNickname);
nicknameUsage.reserve(); //throws if 6 already
person.changeNickname(newNickname);
}
}
Вы также можете инкапсулировать логику управления использованием псевдонима в доменную службу, которая затем вводится в операцию AR changeNickname
.
1017 * Е.Г. *
class Person {
...
void changeNickname(newNickname, nicknameUsageService) {
nicknameUsageService.reserveAndRelease(newNickname, this.nickname);
this.nickname = newNickname;
}
}
Если вы хотите устранить все риски, связанные с несоответствием NicknameUsage
отношениям User-Nickname
, вы можете создать так, чтобы NicknameUsage
был единственным объектом, отслеживающим отношения между пользователями и их псевдонимами (псевдоним не является частью * 1023). * AR вообще).
Наконец, у меня нет большого опыта с возможной последовательностью, и, надеюсь, кто-то еще пролил некоторый свет на то, что было бы правильным подходом, но если вы не хотите изменять много AR на транзакцию, то я думаю, что есть несколько стратегий, которые вы могли бы использовать ,
Например, вы можете разрешить> 6 лицам использовать один и тот же псевдоним, но затем иметь процесс, который обнаруживает нарушения и помечает таких лиц нарушением политики псевдонима, где у них есть льготный период для изменения своего псевдонима, иначе это будет установить на что-то другое автоматически (или любое другое компенсирующее действие). Обратите внимание, что вы все равно будете иметь проверку с использованием доменной службы, чтобы ограничить количество нарушений.
Если вы хотите предотвратить нарушения, вы также можете использовать какую-то сагу, где новый ник сначала зарезервирован, затем старый освобождается и, наконец, псевдоним человека изменяется. Будет короткий промежуток времени, когда у человека на самом деле будет 2 псевдонима с оговоркой, но никогда не будет времени, когда псевдонимы будут использоваться более 6 раз.