困惑我的服务方法应该返回什么

时间:2015-04-08 22:06:23

标签: java model-view-controller model service-layer domain-model

我有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 usernameString passwordint 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对象。这就是我很困惑如何发送它们。我想出了一些选择:


选项1:

更改服务方法签名以返回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;

选项2:

不是更改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;

选项3:

创建一个DTO,其中user类{1}属性Userrole类类型属性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;

选项4:

更改服务方法签名以返回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;

选项5:

没有指向域类的链接。

创建一个类似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,从服务方法返回除域类之外的任何内容是否有意义?

哪些选项可能会破坏设计模式?

更新1

我想到了另外一个我作为第五选项添加的选项。此选项发送DTO,但DTO没有到域模型类的链接。有趣的概念。

请回复我的问题。我处于困境,需要一些经验丰富的开发人员指导方针来推动我前进。

由于

0 个答案:

没有答案