存储库是否应确保将所有必需参数传递给方法?

时间:2011-11-10 00:09:26

标签: c# validation repository

对不起,如果标题没有措辞最好。

我的UserRepository有一个创建新用户的方法。我的验证应该在哪里检查以确保填写用户所需的所有字段:用户名,密码,电子邮件和已创建。如果任何值为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方法实际上应该检查这里的值吗?我觉得它不应该在这里进行验证,但我不确定适合分离的地方。

2 个答案:

答案 0 :(得分:1)

将业务逻辑与数据访问代码分开始终是一个好主意。它使业务逻辑代码更具可读性和可维护性。这里的“验证”是业务逻辑的一部分,因此我建议在上层处理它。考虑创建“服务”类,它们接收输入,验证它们并通过存储库执行数据库访问。

假设您的方案是“通过注册创建新用户”。使用RegistrationService方法生成CreateUser类是有意义的。

还有另一种方法可以使用User类本身作为验证点。您可以使User类不可变,让它在构造函数中接收所有参数并在构造期间验证它们。因此,您排除了存在“无效”实例的可能性。实际上接收User作为参数的任何函数都保证接收“有效用户”实例。

作为最后一点,无论验证如何,都有必要养成检查空参数并在ArgumentNullException函数中抛出public的习惯。

答案 1 :(得分:0)

User类的有效状态的定义实际上是特定于应用程序的。也许你只想在一个案例中使用ID。也许你想要在另一个领域完成全部的全部领域。

对我来说,Create函数是决定这一点的函数。从<{1}}实例创建用户需要

我会在那里检查一下。