我有2个域类:用户和角色。 1用户可以拥有1个或多个角色。
public class User implements Serializable {
private String username;
private String password;
private boolean lockFlag;
private List<Role> rolesList;
// getters and setters
}
public class Role implements Serializable {
private int roleId;
private String description;
// getters and setters
}
在我的服务层中,我有一种方法可以将用户登录到系统中。此方法接收3个参数:String username
,String password
,int roleId
如果发生错误,则会引发异常UserServiceException
。
public void login(String username, String password, int roleId) throws UserServiceException;
服务方法检索用户域类以及相关角色:
User user = userDAO.getUserById(username);
服务方法检索角色域类:
Role role = roleDAO.getRoleById(roleId);
服务方法执行no。检查。假设所有检查都通过,服务方法需要告诉其调用者登录成功并发送user
对象和role
对象。这就是我很困惑如何发送它们。我想出了一些选择:
更改服务方法签名以返回User
域类的对象:
public User login(String username, String password, int roleId) throws UserServiceException;
更改User
域类,再添加一个属于currentRole
类类型的属性Role
:
public class User implements Serializable {
private String username;
private String password;
private boolean lockFlag;
private List<Role> rolesList;
private Role currentRole;
// getters and setters
}
在我的服务方法中,在发送currentRole
对象之前,将user
对象的role
属性设置为user
对象:
user.setCurrentRole(role);
return user;
不是更改User
域类,而是创建一个类似于User
域类的DTO +另一个currentRole
类类型的属性Role
:
public class UserModelDTO implements Serializable {
private String username;
private String password;
private boolean lockFlag;
private List<Role> rolesList;
private Role currentRole;
// getters and setters
}
将服务方法签名更改为返回UserModelDTO
类的对象:
public UserModelDTO login(String username, String password, int roleId) throws UserServiceException;
在我的服务方法中创建一个UserModelDTO
类的对象并发送它:
UserModelDTO userModelDTO = new UserModelDTO();
userModelDTO.setUsername(user.getUsername());
userModelDTO.setPassword(user.getPassword());
userModelDTO.setLockFlag(user.getLockFlag());
userModelDTO.setRolesList(user.getRolesList());
userModelDTO.setCurrentRole(role);
return userModelDTO;
创建一个DTO,其中user
类{1}属性User
,role
类类型属性Role
:
public class UserRoleModelDTO implements Serializable {
private User user;
private Role role;
// getters and setters
}
将服务方法签名更改为返回UserRoleModelDTO
类的对象:
public UserRoleModelDTO login(String username, String password, int roleId) throws UserServiceException;
在我的服务方法中创建一个UserRoleModelDTO
类的对象并发送它:
UserRoleModelDTO userRoleModelDTO = new UserRoleModelDTO();
userRoleModelDTO.setUser(user);
userRoleModelDTO.setRole(role);
return userRoleModelDTO;
更改服务方法签名以返回Map
:
public Map login(String username, String password, int roleId) throws UserServiceException;
在我的服务方法中,创建一个Map
并发送它:
Map map = new HashMap();
map.put("USER_DOMAIN", user);
map.put("ROLE_DOMAIN", role);
return map;
没有指向域类的链接。
创建一个类似RoleModelDTO
类类型的Role
。
创建一个类似UserModelDTO
类类型的User
。
在UserModelDTO
中,属性rolesList
将引用RoleModelDTO
类型的列表。
在UserModelDTO
中,再添加一个属于currentRole
类类型的RoleModelDTO
属性:
public class RoleModelDTO implements Serializable {
private int roleId;
private String description;
// getters and setters
}
public class UserModelDTO implements Serializable {
private String username;
private String password;
private boolean lockFlag;
private List<RoleModelDTO> rolesList;
private RoleModelDTO currentRole;
// getters and setters
}
将服务方法签名更改为返回UserModelDTO
类的对象:
public UserModelDTO login(String username, String password, int roleId) throws UserServiceException;
在我的服务方法中创建一个UserModelDTO
类的对象并发送它:
RoleModelDTO roleModelDTO = new RoleModelDTO();
roleModelDTO.setRoleId(role.getRoleId());
roleModelDTO.setDescription(role.getDescription());
List<RoleModelDTO> roleModelDTOList = new ArrayList<RoleModelDTO>();
for (Role role1 : user.getRolesList()) {
RoleModelDTO roleModelDTO1 = new RoleModelDTO();
roleModelDTO1.setRoleId(role1.getRoleId());
roleModelDTO1.setDescription(role1.getDescription());
roleModelDTOList.add(roleModelDTO1);
}
UserModelDTO userModelDTO = new UserModelDTO();
userModelDTO.setUsername(user.getUsername());
userModelDTO.setPassword(user.getPassword());
userModelDTO.setLockFlag(user.getLockFlag());
userModelDTO.setRolesList(roleModelDTOList);
userModelDTO.setCurrentRole(roleModelDTO);
return userModelDTO;
我应该选择哪个选项?还有其他最有意义的选择吗?如果是,请分享。
有些问题:
1个服务方法是否应该始终返回1个域类?如果想要返回超过1个域类,我们应该在它们之间建立关系吗?
关于选项1,更改域类以包含调用者(控制器)需要的内容是否有意义?
关于选项2,3和4,从服务方法返回除域类之外的任何内容是否有意义?
哪些选项可能会破坏设计模式?
我想到了另外一个我作为第五选项添加的选项。此选项发送DTO,但DTO没有到域模型类的链接。有趣的概念。
请回复我的问题。我处于困境,需要一些经验丰富的开发人员指导方针来推动我前进。
由于