对不起,如果标题没有措辞最好。
我的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方法实际上应该检查这里的值吗?我觉得它不应该在这里进行验证,但我不确定适合分离的地方。
答案 0 :(得分:1)
将业务逻辑与数据访问代码分开始终是一个好主意。它使业务逻辑代码更具可读性和可维护性。这里的“验证”是业务逻辑的一部分,因此我建议在上层处理它。考虑创建“服务”类,它们接收输入,验证它们并通过存储库执行数据库访问。
假设您的方案是“通过注册创建新用户”。使用RegistrationService
方法生成CreateUser
类是有意义的。
还有另一种方法可以使用User
类本身作为验证点。您可以使User类不可变,让它在构造函数中接收所有参数并在构造期间验证它们。因此,您排除了存在“无效”实例的可能性。实际上接收User
作为参数的任何函数都保证接收“有效用户”实例。
作为最后一点,无论验证如何,都有必要养成检查空参数并在ArgumentNullException
函数中抛出public
的习惯。
答案 1 :(得分:0)
User
类的有效状态的定义实际上是特定于应用程序的。也许你只想在一个案例中使用ID。也许你想要在另一个领域完成全部的全部领域。
对我来说,Create
函数是决定这一点的函数。从<{1}}实例创建用户需要
我会在那里检查一下。