【发布时间】:2015-01-16 14:37:24
【问题描述】:
我有一个@Service bean,其功能是将新的Member 实体保存到数据库:
@Service
public class AccountService {
// method A
public void saveMember(Member m) {
entityManager.persit(m);
}
// method B
public void saveMember(String username, String pwd, int age /* ... lots of parameters ... */) {
Member m = new Member();
m.setUsername(username);
m.setPassword(pwd);
// ... ...
entityManager.persit(m);
}
}
我会直接在@Controller bean 中调用saveMember()。哪种方法更好?
如果我使用方法A,那么我必须在@Controller bean 中构造Member 实体,如下所示:
@Controller
public class Controller {
public String profile(@RequestParam String username,
@RequestParam String password
// ... ...
) {
Member m = new Member();
m.setXXX();
// ... ...
// lots of setters method invocation
accountService.saveMember(m);
}
}
如果使用方法 B:
@Controller
public class Controller {
public String profile(@RequestParam String username,
@RequestParam String password
// ... ...
) {
accountService.saveMember(username, password /* lots of parameters */);
}
}
哪个更好? 谢谢!
【问题讨论】:
-
我猜两者都是一样的,它只取决于你要使用的参数。
Member object或String参数 -
@Kerppag 此应用程序将分发。也许方法 B 更好?
-
就代码可读性而言,我认为方法 B 更好。顺便说一句,你在使用 Spring @Neo 吗?
-
我建议选项 X。以上都不是。我是保护您的域的忠实拥护者,您的域只能从服务中访问。创建一个包含参数的对象,并使用该对象在服务内部构造一个成员。根据您的喜好,它可能是
MemberDto、CreateMemberRequest或CreateMemberCommand。这也解决了例如在哪里存储/离开verifyPassword字段的问题(因为这通常不是Member的一部分)。额外的好处是,您的架构现在更多地关注代码的意图。 -
@M.Deinum 感谢您的评论。我同意你的意见“
domain should only be accessed from the services”
标签: spring spring-mvc