IUserRetrieveService Interface

[namespace: Serenity.Abstractions, assembly: Serenity.Core]

When Serenity needs to access IUserDefinition object for a given user name or user ID, it uses this interface.

  1. public interface IUserRetrieveService
  2. {
  3. IUserDefinition ById(string id);
  4. IUserDefinition ByUsername(string username);
  5. }

In your implementation, it is a good idea to cache user definition objects, as a common WEB application might use this interface repeatedly for same user.

Serenity Basic Application sample has an implementation like below:

  1. public class UserRetrieveService : IUserRetrieveService
  2. {
  3. private static MyRow.RowFields fld { get { return MyRow.Fields; } }
  4. private UserDefinition GetFirst(IDbConnection connection, BaseCriteria criteria)
  5. {
  6. var user = connection.TrySingle<Entities.UserRow>(criteria);
  7. if (user != null)
  8. return new UserDefinition
  9. {
  10. UserId = user.UserId.Value,
  11. Username = user.Username,
  12. //...
  13. };
  14. return null;
  15. }
  16. public IUserDefinition ById(string id)
  17. {
  18. if (id.IsEmptyOrNull())
  19. return null;
  20. return TwoLevelCache.Get<UserDefinition>("UserByID_" + id, CacheExpiration.Never, CacheExpiration.OneDay, fld.GenerationKey, () =>
  21. {
  22. using (var connection = SqlConnections.NewByKey("Default"))
  23. return GetFirst(connection,
  24. new Criteria(fld.UserId) == id.TryParseID32().Value);
  25. });
  26. }
  27. public IUserDefinition ByUsername(string username)
  28. {
  29. if (username.IsEmptyOrNull())
  30. return null;
  31. return TwoLevelCache.Get<UserDefinition>("UserByName_" + username, CacheExpiration.Never, CacheExpiration.OneDay, fld.GenerationKey, () =>
  32. {
  33. using (var connection = SqlConnections.NewByKey("Default"))
  34. return GetFirst(connection, new Criteria(fld.Username) == username);
  35. });
  36. }
  37. }