C# 存储库是否应该确保所有必需的参数都传递到方法中?

C# 存储库是否应该确保所有必需的参数都传递到方法中?,c#,validation,repository,C#,Validation,Repository,对不起,如果标题的措辞不是最好的 My UserRepository有一个将创建新用户的方法。我的验证应该在哪里进行检查,以确保填写了创建用户所需的所有字段:用户名、密码、电子邮件和已创建。如果任何值为null,则insert将抛出错误 public class UserRepository : IRepository<User> { public DbConnection Connection { get; set; } public UserRepository

对不起,如果标题的措辞不是最好的

My UserRepository有一个将创建新用户的方法。我的验证应该在哪里进行检查,以确保填写了创建用户所需的所有字段:用户名、密码、电子邮件和已创建。如果任何值为null,则insert将抛出错误

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();
        }
    }        
}
公共类用户存储库:IRepository
{
公共数据库连接{get;set;}
公共用户存储库(DbConnection)
{
这个连接=连接;
}
公共无效创建(用户)
{
string sql=“插入[dbo].[User](用户名、密码、电子邮件、已创建)值(@Username、@Password、@Email、@Created)”;
使用(DbCommand command=new SqlCommand())
{
command.Connection=this.Connection;
command.CommandText=sql;
添加(新的SqlParameter(“@Username”,user.Username));
添加(新的SqlParameter(“@Password”,user.Password));
command.Parameters.Add(新的SqlParameter(“@Email”,user.Email));
添加(新的SqlParameter(“@Created”,user.Created));
command.ExecuteScalar();
}
}        
}

我的create方法是否应该检查这里的值?我觉得它不应该在这里进行验证,但我不确定分离的合适位置。

用户类的有效状态定义实际上是特定于应用程序的。也许你只是想在一个案件的ID。也许您希望在另一个域中完成所有字段的完整操作

对我来说,
Create
函数决定了这一点。从
用户
实例创建用户需要哪些信息


我会马上检查。

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

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

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


最后一点,检查空参数并在
public
函数中抛出
ArgumentNullException
,这有助于养成习惯,而不考虑验证。

因此,本质上,我会在我的服务中检查以验证(null、空字符串或正则表达式)然后在我的create方法中,我仍然会检查参数null值?是的,存储库中的create方法只会检查null输入。这只是为了使调试更容易。