Должен ли репозиторий убедиться, что все требуемые параметры переданы в методы?

#c# #validation #repository

#c# #проверка #репозиторий

Вопрос:

Извините, если заголовок сформулирован не лучшим образом.

В моем пользовательском хранилище есть метод, который создаст нового пользователя. Куда следует направить мою проверку, чтобы убедиться, что заполнены все поля, необходимые для создания пользователя: имя пользователя, пароль, электронная почта и Создано. Если какое-либо из значений равно null, то вставка выдаст ошибку.

 public class UserRepository : IRepository<User>
{
    public DbConnection Connection { get; set; }

    public UserRepository(DbConnection connection)
    {
        this.Connection = connection;
    }

    public void Create(User user)
    {
        string sql = "INSERT INTO [dbo].[User] (Username, Password, Email, Created) VALUES (@Username, @Password, @Email, @Created)";

        using (DbCommand command = new SqlCommand())
        {
            command.Connection = this.Connection;
            command.CommandText = sql;
            command.Parameters.Add(new SqlParameter("@Username", user.Username));
            command.Parameters.Add(new SqlParameter("@Password", user.Password));
            command.Parameters.Add(new SqlParameter("@Email", user.Email));
            command.Parameters.Add(new SqlParameter("@Created", user.Created));
            command.ExecuteScalar();
        }
    }        
}
  

Должен ли мой метод create действительно проверять значения здесь? Я чувствую, что здесь не следует выполнять проверку, но я не уверен, что это подходящее место для разделения.

Ответ №1:

Всегда полезно отделять бизнес-логику от кода доступа к данным. Это делает код бизнес-логики более читаемым и поддерживаемым. «Проверка» здесь является частью бизнес-логики, поэтому я рекомендую обрабатывать ее на верхнем уровне. Подумайте о создании «сервисных» классов, которые получают входные данные, проверяют их и осуществляют доступ к БД через репозиторий.

Допустим, ваш сценарий — «создать нового пользователя путем регистрации». Имеет смысл иметь RegistrationService класс с CreateUser методом.

Существует другой вариант использования User самого класса для проверки. Вы можете сделать пользовательский класс неизменяемым, заставить его получать все параметры в конструкторе и проверять их во время построения. Таким образом, вы исключаете возможность наличия «недопустимого» экземпляра. Любая функция, которая получает User в качестве параметра, на самом деле гарантированно получит экземпляр «действительного пользователя».

В качестве последнего замечания, это помогает выработать привычку проверять наличие нулевых аргументов и вставлять ArgumentNullException в public функции, независимо от проверки.

Комментарии:

1. Итак, по сути, я бы проверил в своем сервисе правильность (null, пустая строка или регулярное выражение), а затем в моем методе create я бы все равно проверил наличие нулевых значений аргумента?

2. да, ваш метод create в репозитории будет проверять только ввод null. и это просто для упрощения отладки.

Ответ №2:

Определение допустимого состояния User класса действительно зависит от конкретного приложения. Возможно, вам просто нужен идентификатор в одном случае. Возможно, вы хотите, чтобы все поля были полностью выполнены в другом.

Для меня Create функция — это та, которая определяет это. Какая информация вам требуется для создания пользователя из User экземпляра?

Я бы проверил это прямо там.