Как построить богатую модель домена с EntityFramework - PullRequest
2 голосов
/ 04 ноября 2011

Я использую Entity Framework 4.2 (Code First) для создания своей базы данных, которая до сих пор работала нормально, но сейчас сталкиваюсь с проблемой, которую очень легко решить в Hibernate или JPA, но я не могу ее здесь увидеть.

Я определил объект User, у которого есть свойство с именем Password. Я хочу настроить операции {get; set;}, чтобы иметь определенную логику при установке пароля (я хочу сохранить его хеш-версию, но я хочу эту логику в моем доменном объекте аля DDD). Но я столкнулся с тем, что при материализации объекта из базы данных вызывается мой установщик, и он не использует непосредственно закрытое поле.

Я пытаюсь построить объектную модель Rich Domain и избегаю использования шаблона DAO / Repository.

Возможно ли это через Entity Framework или я буду вынужден использовать шаблоны DAO / Repository.

Ниже приведено извлечение моего объекта User:

public class User
{
    [Key]
    public string LoginId { get; set; }

    [Required]
    private string password;

    public string Password
    {
        get { return password; }
        set {
            //Random Salt
            byte[] s;
            using (RNGCryptoServiceProvider prov = new RNGCryptoServiceProvider())
            {
                s = new byte[20];
                prov.GetBytes(s);
            }
            this.salt = Convert.ToBase64String(s);
            //Random salt                
            password = ComputeHash(value);
            }
    }

    [Required]
    private string salt;
    public string Salt { 
                         get { return this.salt; }
                         set { throw new InvalidOperationException("Salt is not an assignable property. Assign a password first to your model and a Salt will get created."); }
                       }

    public bool ValidatePassword(string clearTextPassword)
    {
        return this.Password == this.ComputeHash(clearTextPassword);
    }
    public string ComputeHash(string value)
    {
       ...
       return hashVersion of value;

    }

}

1 Ответ

0 голосов
/ 25 января 2012

Начните с добавления зашифрованного объекта значения строки пароля (неизменяемого)

, например

public class EncryptedString
{
  public string Value { get;private set; }
  public string Hash { get;private set; }
  bool Validate(string password);

  public Encrypted(string value)
  {
     // Put logic here
  }
}

В EF это называется сложный тип

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...