Как использовать FluentValidation в патерне репозиторий, когда необходимо проверить уникальность, например, логина (проверяется в БД)?
Пояснение:
Решение состоит из 4 проектов:
Структура проекта RTLservise.Model:
Класс UserValidator:
public class UserValidator : AbstractValidator<User>
{
public UserValidator()
{
RuleFor(x => x.Login)
.Must(CheckUserName)
.WithMessage("Login некорректный.");
.Must(IsLoginUnique)
.WithMessage("Пользователь с таким логином уже зарегистрирован.");
}
private bool CheckUserName(string login)
{
if (login == null)
return false;
string pattern = @"^[a-zA-Z][a-zA-Z0-9-_\.]{1,49}$";
Regex regex = new Regex(pattern);
return regex.IsMatch(login);
}
}
Выполнить CheckUserName не составило труда.
НО:
Проверить пользователя на уникальность (выполнить функцию uf_Bit_exists_login ), например так:
public bool IsLoginUnique(string login)
{
if (login == null)
{
return false;
}
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "uf_Bit_exists_login";
var returnValue = command.Parameters.AddWithValue("@login", login);
returnValue.Direction = ParameterDirection.ReturnValue;
command.ExecuteNonQuery();
return (bool)returnValue.Value;
}
}
}
И вот тут все тесты сразу падают.
Правильно ли размещать проверку, связанную с подключением к БД именно в классе валидатора??
Хотелось конечно что-то, наподибие:
IUserRepository _repository = new UserRepository();
А затем выполнить проверку:
_repository.IsLoginUnique(string)
НО: это невозможно, т.к. возникают циклические ссылки:( Тогда может перенести логику валидирования в службу? Неясно, при таком подходе проектирования, где вообще выполнять проверку?
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости