IUserRetrieveService 接口

[命名空间: Serenity.Abstractions, 程序集: Serenity.Core]

当 Serenity 需要使用给定的用户名或者用户 ID 访问 IUserDefinition 对象时,它需要使用该接口。

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

在你的实现中,缓存用户定义对象是一个好主意,因为通常 WEB 应用程序的同一用户可能重复使用此接口。

Serenity 基本应用程序示例已经有该接口的实现,如:

  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. }