什么类应该有能力设置密码(存储库,用户等)?

时间:2010-06-29 13:26:25

标签: c# domain-driven-design entity-framework-4

我正在使用Entity Framework 4.我不确定设置用户密码的责任在哪里。我想像SetPassword(User user, string password)那样在Repository上考虑过。但这似乎不对。

主要问题是它不能只是一个简单的属性设置器,因为我也返回生成的盐。

3 个答案:

答案 0 :(得分:3)

您可能希望创建某种类型的模块来处理要调用的User类的密码创建。这更符合单一责任原则(一个班级应该只有一个责任,有时读作“只有一个改变的理由”)。

由于您的密码应该在被保留之前被加盐和散列,这肯定超出了用户应该做的范围。 然后,您可以使用一个模块与User分开,以使用相同的salt和hash方法验证密码。

答案 1 :(得分:2)

您可以引入Password课程。 Password类的User属性应为Password,而不是string

public class User
{
  public Password Password { get; set; }
}

public class Password
{
  private string value;
  private string salt;

  public Password(string value)
  {
    this.salt = "generated salt";
    this.value = value;
  }

  public string ToHashedString()
  {
    // Return the hashed password.
  }
}

Password类可能负责生成盐本身。您还可以引入使用其他依赖项生成salt并构造PasswordService实例的Password

答案 2 :(得分:1)

它不应该在Repository中,因为它应该仅用于数据库访问而不是用于业务逻辑。我认为它应该在User类中。

public class User
{
  IUserPasswordManager _userPasswordManager;

  public string SetPassword(string oldPassword, string newPassword)
  {
     //Set password and return salt
     return _userPasswordManager.SetPasswordForUser(this, oldPassword, newPAssword);  

  }

}