Использование FluentValidation в патерне “Repository”?

351
21 февраля 2017, 15:54

Как использовать 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)

НО: это невозможно, т.к. возникают циклические ссылки:( Тогда может перенести логику валидирования в службу? Неясно, при таком подходе проектирования, где вообще выполнять проверку?

READ ALSO
Сравнение циклов

Сравнение циклов

Добрый день!

397
возможно ли преобразовать Array в int[,] C#

возможно ли преобразовать Array в int[,] C#

Задача возникла следующая: создать метод, расширяющий массив произвольной размерности

339
Xamarin.Forms и клавиатура чата

Xamarin.Forms и клавиатура чата

Пишу чат на XamarinForms и есть необходимость не прятать клавиатуру по нажатию на кнопку Send и прятать ее при тапе в любом другом месте

554