gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:02:28 26 4
gpt4 key购买 nike

抱歉,如果标题不是最好的措辞。

我的 UserRepository 有一个创建新用户的方法。我的验证应该去哪里检查以确保填写创建用户所需的所有字段:用户名、密码、电子邮件和已创建。如果任何值为空,则插入将引发错误。

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();
}
}
}

我的创建方法是否应该实际检查此处的值?我觉得它不应该在这里做验证,但我不确定分离的合适位置。

最佳答案

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

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

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

作为最后的说明,它有助于养成检查空参数并在 public 函数中抛出 ArgumentNullException 的习惯,而不管验证如何。

关于c# - 存储库是否应该确保所有必需的参数都传递到方法中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com