Куда я должен поместить уникальную регистрацию DDD?

Как и я, если вы спешите изучать новый язык, прыгайте прямо. Но если у вас много времени (студент), я думаю, что каждый, кто хочет называться кодером, должен знать C.

13
задан Shane Fulmer 15 June 2009 в 20:51
поделиться

2 ответа

В DDD есть понятие, называемое агрегат . Он в основном отвечает за согласованность в приложении.

ИМХО, в данном случае конкретно, я предполагаю, что CustomerRepository будет внутри чего-то вроде «агрегата клиента», будучи классом клиента совокупным корнем.

Тогда корень будет нести ответственность за все это, и нет еще один может получить доступ к параметрам CustomerRepository. И есть несколько возможностей:

  • CustomerRepository может вызвать исключение, если имя не является уникальным (и Клиент поймает и вернет ошибку или что-то в этом роде)
  • CustomerRepository может иметь IsValidUserName (), что Клиент позвонит, прежде чем делать что-либо еще
  • Любой другой вариант, о котором вы можете подумать
2
ответ дан 2 December 2019 в 01:57
поделиться

Мне нравится ответ Самуэля, но для простоты я бы порекомендовал реализовать спецификацию . Вы создаете спецификацию, которая возвращает логическое значение, чтобы увидеть, соответствует ли объект определенным критериям. Добавьте IUserRepository в спецификацию, проверьте, существует ли уже пользователь с таким именем, и верните логический результат.

public interface ISpecification<T>
{
  bool IsSatisfiedBy(TEntity entity);
}

public class UniqueUsernameSpecification : ISpecification<User>
{
  private readonly IUserRepository _userRepository;

  public UniqueUsernameSpecification(IUserRepository userRepository)
  {
    _userRepository = userRepository;
  }

  public bool IsSatisfiedBy(User user)
  {
    User foundUser = _userRepository.FindUserByUsername(user.Username);
    return foundUser == null;
  }
}

//App code    
User newUser;

// ... registration stuff...

var userRepository = new UserRepository();
var uniqueUserSpec = new UniqueUsernameSpecification(userRepository);
if (uniqueUserSpec.IsSatisfiedBy(newUser))
{
  // proceed
}
3
ответ дан 2 December 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: