Model view controller MVC实施/最佳实践问题
我必须使用一些不是真正的MVC的代码(例如,它不使用显式框架)。现在,我们使用servlet将数据传递给服务 这是我的问题。我收到一个servlet的帖子,其中包含一大堆我必须保存到数据库中的地址数据。数据(显然)在Model view controller MVC实施/最佳实践问题,model-view-controller,design-patterns,Model View Controller,Design Patterns,我必须使用一些不是真正的MVC的代码(例如,它不使用显式框架)。现在,我们使用servlet将数据传递给服务 这是我的问题。我收到一个servlet的帖子,其中包含一大堆我必须保存到数据库中的地址数据。数据(显然)在HttpServletRequest对象中。我的问题是,如何将这些数据传递到服务中?我不愿意这样做: AddressService.saveAddress(request); String addressLine = request.getParameter("addressLin
HttpServletRequest
对象中。我的问题是,如何将这些数据传递到服务中?我不愿意这样做:
AddressService.saveAddress(request);
String addressLine = request.getParameter("addressLine");
..
.. about 7 other parameters
..
String zip = request.getParameter("zip");
AddressService.saveAddress(addressLine, ... 7 other parameters ..., zip);
因为我认为服务不应该依赖于请求。我的另一个选择是这样做:
AddressService.saveAddress(request);
String addressLine = request.getParameter("addressLine");
..
.. about 7 other parameters
..
String zip = request.getParameter("zip");
AddressService.saveAddress(addressLine, ... 7 other parameters ..., zip);
但是我也不喜欢有大量参数的函数。我正在考虑创建一个名为
AddressData
的中间对象,该对象将保存来自请求的数据,然后将其传递到服务中。这是一种可以接受的做事方式吗?是的,这是一种消除这种依赖性的已知方式。我一时想不起确切的来源,但有几本书包括了这项技术
这种方法的一种变体是使
AddressData
成为一个包装器,它本身没有复制和保存所有需要的请求数据,只保留对它的私有引用,并将所有调用转发给它。这可能更灵活、更干净,尤其是在有许多请求参数和/或参数经常更改/引入新参数的情况下。是的,这是一个有效的解决方案,称为。使用接口来解耦:
型号:
public interface Address {
String getLine1();
String getLine2();
...
String getZip();
}
public class AddressBase implements Address {
public AddressBase(String line1, String line2, ..., String zip) {
...
}
...
}
public class AddressService {
void saveAddress(Address address);
}
现在控制器具有选项,并且模型受到控制器实现的保护:
控制器选项1:
// wrap - lazy interrogator
class AddressRequestWrapper implements Address {
...
AddressRequestWrapper(HttpRequest request) {
this.request = request;
}
String getLine1() { return request.get(LINE_1_FIELD_ID); }
...
}
控制器选项2:
// "wrap" - eager interrogator
class AddressRequestWrapper extends AddressBase {
AddressRequestWrapper(HttpRequest request) {
super(
request.get(LINE_1_FIELD_ID),
request.get(LINE_2_FIELD_ID),
...
request.get(ZIP_FIELD_ID)
);
}
...
}
控制器选项3:
// Just use AddressBase directly
Address address =
new AddressBase(
request.get(LINE_1_FIELD_ID),
request.get(LINE_2_FIELD_ID),
...
request.get(ZIP_FIELD_ID)
);
AddressService.saveAddress(address);