Внедрение MVC / вопрос передового опыта - PullRequest
2 голосов
/ 16 апреля 2010

Мне нужно работать с некоторым кодом, который не является по-настоящему MVC (то есть, он не использует явный фреймворк среди других вещей). Прямо сейчас мы обходимся с сервлетами, которые передают данные сервисам.

Вот моя проблема. Я получаю сообщение с сервлетом, которое содержит целую кучу адресных данных, которые я должен сохранить в базе данных. Данные (очевидно) находятся в объекте 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);

Но мне также не нравится иметь функцию с огромным количеством параметров. Я думал о создании промежуточного объекта с именем AddressData, который будет хранить данные из запроса, а затем передать его в службу. Это приемлемый способ делать вещи?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2010

Да, это правильное решение и называется Параметр объекта .

2 голосов
/ 16 апреля 2010

Да, это известный способ устранения этой зависимости. Я не могу вспомнить точные источники из головы, но несколько книг включают эту технику.

Вариантом этого было бы сделать AddressData оболочкой, которая вместо того, чтобы копировать и хранить все необходимые данные запроса в себе, просто сохраняет частную ссылку на нее и перенаправляет все обращения к ней. Это может быть более гибким и чистым, особенно если есть много параметров запроса и / или параметры изменяются / часто вводятся новые параметры.

1 голос
/ 16 апреля 2010

Используйте интерфейсы для развязки:

Модель:

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);
...