Как и я, если вы спешите изучать новый язык, прыгайте прямо. Но если у вас много времени (студент), я думаю, что каждый, кто хочет называться кодером, должен знать C.
В DDD есть понятие, называемое агрегат . Он в основном отвечает за согласованность в приложении.
ИМХО, в данном случае конкретно, я предполагаю, что CustomerRepository будет внутри чего-то вроде «агрегата клиента», будучи классом клиента совокупным корнем.
Тогда корень будет нести ответственность за все это, и нет еще один может получить доступ к параметрам CustomerRepository. И есть несколько возможностей:
Мне нравится ответ Самуэля, но для простоты я бы порекомендовал реализовать спецификацию . Вы создаете спецификацию, которая возвращает логическое значение, чтобы увидеть, соответствует ли объект определенным критериям. Добавьте 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
}