我会使用类似于以下代码示例的内容。它使用单例模式在事务期间将信息静态存储在内存中。它类似于 twamley 提出的延迟加载,但我觉得这是一种更简单的方法。
用法一:UserUtil.CurrentUser.Email;
用法2:用户 someUser = UserUtil.getUser(someUserId);
这将允许您访问有关当前用户或系统中其他用户的相同信息。注意 queryUsers 方法只返回一个查询结果。这使得从查询中添加和删除字段变得容易,因为它以自己的方法隔离,使事情变得简单。
注意:此代码在使用时会吸引所有用户。大多数组织没有数百个用户,因此堆大小不应该是一个问题。但如果是,您可以修改 queryUsers() 方法以仅返回活动用户或根据其他条件进行过滤。
public class UserUtil {
//Protected Members
private static final UserUtil instance = new UserUtil();
private Map<Id, User> mapUsers;
//Properties
public static User CurrentUser {
get { return getUser(UserInfo.getUserId()); }
}
//Constructor
private UserUtil() {
mapUsers = new Map<Id, User>(queryUsers());
}
//Public Methods
public static User getUser(Id userId) {
if (instance.mapUsers.containsKey(userId)) {
return instance.mapUsers.get(userId);
}
else {
throw new InvalidUserIdException('Unable to locate user id: ' + userId);
}
}
//Private Methods
private List<User> queryUsers() {
return [SELECT
Id
, Name
, UserName
, Email
, Alias
FROM
User];
}
//Internal Classes
public class InvalidUserIdException extends Exception {}
}