UserStoreクラス実装
Redisを操作する準備ができたところで、今度はユーザー情報を操作するApplicationUserStoreクラスを実装していきます。
Redisハッシュ操作用フィールド定義
先述したuserIdsハッシュ、usersハッシュを操作するため、RedisHash型のフィールドを定義します(リスト2)。
private readonly RedisHash<String> userIds = new RedisHash<String>(RedisServer.Default, "userIds"); private readonly RedisHash<String> users = new RedisHash<String>(RedisServer.Default, "users"); }
CloudStructuresでRedisハッシュを操作するには、RedisHash<TKey>型を使います。userIds、usersともキーは文字列型なので、TKey型パラメーターにはstringを指定します。また、コンストラクタ引数では、先述したRedisServer型のオブジェクトと、作成するハッシュのキーを指定します。
パスワードハッシュ設定処理
ユーザー情報にハッシュ化したパスワードを設定するため、IUserPasswordStore<TUser>インターフェースのSetPasswordHashAsync非同期メソッドを実装します(リスト3)。なお、asyncキーワードをメソッドにつけることで、Taskクラスを戻り値とする非同期メソッドをわかりやすく実装できるようになります。
/// <summary> /// ハッシュ化されたパスワードをユーザー情報に設定します。 /// </summary> /// <param name="user">ユーザー情報。</param> /// <param name="passwordHash">ハッシュ化されたパスワード。</param> /// <returns></returns> public async Task SetPasswordHashAsync(ApplicationUser user, string passwordHash) { user.PasswordHash = passwordHash; }
ユーザー登録処理
データストアにユーザー情報を作成して登録するため、IUserStore<TUser>インターフェースのCreateAsync非同期メソッドを実装します(リスト4)。
/// <summary> /// ユーザー情報をデータストアに作成します。 /// </summary> /// <param name="user">ユーザー情報。</param> /// <returns></returns> public async Task CreateAsync(ApplicationUser user) { var result = await userIds.Set(user.UserName, user.Id); if (result) { await users.Set(user.Id, user); } }
RedisHash<TKey>クラスのSetメソッドを呼び出し、userIds、usersハッシュにそれぞれ情報を登録します。Setメソッドの引数はRedisハッシュのfieldとvalueです。
なお、usersハッシュのvalueに直接ApplicationUserオブジェクトを渡していますが、CloudStructuresの既定の動作により、JSON形式にシリアライズされてRedisに設定されます。
ユーザー取得処理
データストアにRedisを使うようにしたため、前回作成したFindByNameAsyncメソッドも変更します(リスト5)。
/// <summary> /// ユーザー名を使いユーザーを検索します。 /// </summary> /// <param name="userName">ユーザー名。</param> /// <returns>見つかったユーザー情報。見つからない場合はnullを返す。</returns> public async Task<ApplicationUser> FindByNameAsync(string userName) { var id = await userIds.Get<string>(userName); if (id.HasValue) { var user = await users.Get<ApplicationUser>(id.Value); return user.HasValue ? user.Value : null; } else { return null; } }
RedisHash<TKey>クラスのGetメソッドを呼び出し、userIds、usersハッシュからユーザー情報を取得します。Getメソッドの引数は、Redisハッシュのfieldです。
まずuserIdsハッシュからユーザー名に対応するIDを取得します。見つかったかどうかは、Getメソッドの戻り値のHasValueプロパティで判定できます。
IDが取得できたら、今度は取得したIDを使いusersハッシュからユーザー情報を取得します。取得したIDの値はValueプロパティで取得できます。また、Getメソッドの型引数にAppliationUser型を指定することで、ユーザー情報を取得する際JSON形式からApplicationUserオブジェクトに自動的にデシリアライズされます。