1
1
using System ;
2
+ using System . Collections ;
2
3
using System . Collections . Generic ;
3
4
using System . Linq ;
4
5
using ServiceStack . Common . Extensions ;
@@ -44,63 +45,59 @@ public Repository(IRedisClientsManager redisManager)
44
45
public User GetOrCreateUser ( User user )
45
46
{
46
47
if ( user . DisplayName . IsNullOrEmpty ( ) )
47
- throw new ArgumentNullException ( "user. DisplayName" ) ;
48
+ throw new ArgumentNullException ( "DisplayName" ) ;
48
49
49
- var userIdNameMapKey = "id:User:DisplayName:" + user . DisplayName . ToLower ( ) ;
50
+ var userIdAliasKey = "id:User:DisplayName:" + user . DisplayName . ToLower ( ) ;
50
51
51
52
using ( var redis = RedisManager . GetClient ( ) )
52
53
using ( var redisUsers = redis . GetTypedClient < User > ( ) )
53
54
{
54
- var userKey = redis . GetValue ( userIdNameMapKey ) ;
55
+ //Find user by DisplayName
56
+ var userKey = redis . GetValue ( userIdAliasKey ) ;
55
57
if ( userKey != null )
56
58
return redisUsers . GetValue ( userKey ) ;
57
59
60
+ //Generate Id for New User
58
61
if ( user . Id != default ( long ) )
59
62
user . Id = redisUsers . GetNextSequence ( ) ;
60
63
64
+ //Create or Update New User
61
65
redisUsers . Store ( user ) ;
62
- redis . SetEntry ( userIdNameMapKey , user . CreateUrn ( ) ) ;
66
+ //Save reference to User key using the DisplayName alias
67
+ redis . SetEntry ( userIdAliasKey , user . CreateUrn ( ) ) ;
63
68
69
+ //Retrieve the User by Id
64
70
return redisUsers . GetById ( user . Id ) ;
65
71
}
66
72
}
67
73
68
- //Reduce the boilerplate for common access
69
- T ExecRedisQuestions < T > ( Func < IRedisTypedClient < Question > , T > lamda )
70
- {
71
- using ( var redis = RedisManager . GetClient ( ) )
72
- using ( var redisQuestions = redis . GetTypedClient < Question > ( ) )
73
- {
74
- return lamda ( redisQuestions ) ;
75
- }
76
- }
77
-
78
74
public List < Question > GetAllQuestions ( )
79
75
{
80
- return ExecRedisQuestions ( q => q . GetAll ( ) . ToList ( ) ) ;
76
+ //Use 'Exec<T>' extension method to easy access to: 'redis.GetTypedClient<Question>()'
77
+ return RedisManager . Exec < Question > ( q => q . GetAll ( ) ) . ToList ( ) ;
81
78
}
82
79
83
80
public List < Question > GetRecentQuestions ( int skip , int take )
84
81
{
85
- return ExecRedisQuestions ( q => q . GetLatestFromRecentsList ( skip , take ) ) ;
82
+ //Use 'Exec<T>' extension method to easy access to: 'redis.GetTypedClient<Question>()'
83
+ return RedisManager . Exec < Question > ( q => q . GetLatestFromRecentsList ( skip , take ) ) ;
86
84
}
87
85
88
86
public void StoreQuestion ( Question question )
89
87
{
90
- using ( var redis = RedisManager . GetClient ( ) )
91
- using ( var redisQuestions = redis . GetTypedClient < Question > ( ) )
88
+ RedisManager . Exec < Question > ( redisQuestions =>
92
89
{
93
90
if ( question . Id == default ( long ) )
94
91
question . Id = redisQuestions . GetNextSequence ( ) ;
95
92
96
93
redisQuestions . Store ( question ) ;
97
94
redisQuestions . AddToRecentsList ( question ) ;
98
- }
95
+ } ) ;
99
96
}
100
97
101
98
public void StoreAnswer ( Answer answer )
102
99
{
103
- using ( var redis = RedisManager . GetReadOnlyClient ( ) )
100
+ using ( var redis = RedisManager . GetClient ( ) )
104
101
using ( var redisQuestions = redis . GetTypedClient < Question > ( ) )
105
102
using ( var redisAnswers = redis . GetTypedClient < Answer > ( ) )
106
103
{
@@ -114,7 +111,11 @@ public void StoreAnswer(Answer answer)
114
111
115
112
public List < Answer > GetAnswersForQuestion ( long questionId )
116
113
{
117
- return ExecRedisQuestions ( q => q . GetRelatedEntities < Answer > ( questionId ) ) ;
114
+ using ( var redis = RedisManager . GetClient ( ) )
115
+ using ( var redisQuestions = redis . GetTypedClient < Question > ( ) )
116
+ {
117
+ return redisQuestions . GetRelatedEntities < Answer > ( questionId ) ;
118
+ }
118
119
}
119
120
120
121
public void VoteQuestionUp ( long userId , long questionId )
0 commit comments