我正在使用带弹簧的MVC所以我想从我的控制器传递一些参数,这个字段来自我的提交表单,我的问题是通过这个字段的最佳方式,通过bean表单发送到服务或创建另一个豆 。
@Autowired
RegisterServiceImpl registerServiceImpl;
@RequestMapping(value="/registeruser", method = RequestMethod.POST )
public String register( @ModelAttribute(value = "registerForm") RegisterForm registerForm , ModelMap model{
//previous method extract each field from registerForm
//registerServiceImpl.registerUser(field1,field2,field3,fieldn);
//actual method pass object registerForm
registerServiceImpl.registerUser(registerForm);
}
问题是如果将RegisterForm传递给服务类产生高耦合? o使用最佳实践进行低成本耦合的一些替代方案。
答案 0 :(得分:1)
RegisterForm确实是一个DTO,正如vivin-paliath提到的那样,你可能会在DTO的部分数据有用的情况下结束,因此需要转换器。
我建议使用spring提供的Converters,您只需要注册自定义实现,并且对转换服务的单个调用可以保持代码清洁并与转换逻辑分离。
答案 1 :(得分:0)
RegisterForm
是否会产生紧耦合取决于您的用例。 RegisterServiceImpl#registerUser
在多个地方使用了吗? RegisterForm
类型也会从重用中受益吗?如果是这种情况,则不应存在问题,并且可以使用RegisterForm
作为控制器中的命令对象。在这种情况下,RegisterForm
实际上是DTO。
但是,您最终可能会遇到RegisterForm
包含其他详细信息(可能由RegisterServiceImpl
中的其他方法使用)的情况,这些细节永远不会来自视图,或者您需要执行某种操作翻译/转换来自视图的数据。如果主要是这种情况,我通常会创建一个命令对象,然后将该对象的信息转换为RegisterForm
的实例,然后将其传递给服务。