2011-03-16 10 views
0

アカウントパスワードがデータベースにハッシュとして保存されるNHibernateを使用して、3層アプリケーションを作成しています。Nhibernateが特定の列を更新しないようにしますか?

プレゼンテーションレイヤーは、パスワードをリポジトリに渡す前にパスワードがハッシュされる、サービス内のアカウントエンティティを必要とするsaveメソッドを呼び出します。

初めてアカウントが保存され、パスワードが正しくハッシュされ、すべて正常です。

パスワードを変更せずにアカウントを更新すると、アカウントエンティティのパスワードプロパティの値は既にハッシュされています。サービスの保存メソッドを通過するとハッシュされます。

私のエンティティは次のようになります。

public class AccountEntity : EntityBase { 
    public virtual string Username { get; set; } 
    public virtual string Password { get; set; } 
    public virtual string Email { get; set; } 
    public virtual bool Enabled { get; set; } 
} 

そして保存方法と私のサービス:

public class AccountService { 
    private readonly IRepository<AccountEntity> _accountRepository; 
    private readonly IHashingProvider _hashingProvider; 

    public AccountService(IRepository<AccountEntity> accountRepository, IHashingProvider hashingProvider) { 
     _accountRepository = accountRepository; 
     _hashingProvider = hashingProvider; 
    } 

    public void Save(AccountEntity accountEntity) { 
     accountEntity.Password = _hashingProvider.Hash(accountEntity.Password); 
     _accountRepository.Save(accountEntity); 
    } 
} 

がどのようにパスワードを更新しないようにNHibernateはを伝えることができますか?他にどのような可能性がありますか?

答えて

2

私はNHibernate層を扱わない方法でこれに取り組むことを提案したいと思います。 「ハッシュを必要とする」最初の作成操作を、「ハッシュを必要としない」更新操作の一般的な保存操作から単に分離してください。

たとえば、Save()にハッシュとデリゲートを行うことができるアカウントを最初に作成するために、AccountServiceにCreate()メソッドを追加します。一般的なSave()は、オブジェクトを正常に永続させることができます。

パスワードの変更を永続化するメソッドを追加して、新しく要求されたパスワードをハッシュで実行し、Save()を呼び出すこともできます。

1

セッションインターセプタを使用してOnSave関数を使用して、元のプロパティ値を再設定することができます

関連する問題