Что такое IoC / Springy для обработки MVP в GWT?(Подсказка, вероятно, не в Spring Roo 1.1) - PullRequest
3 голосов
/ 30 декабря 2010

Это Spring Roo 1.1 способ создания фабрики, которая возвращает GWT Activity (Да, Spring Framework)

 public Activity getActivity(ProxyPlace place) {
    switch (place.getOperation()) {
      case DETAILS:
        return new EmployeeDetailsActivity((EntityProxyId<EmployeeProxy>)place.getProxyId(), requests, 
          placeController, ScaffoldApp.isMobile() ? EmployeeMobileDetailsView.instance() : EmployeeDetailsView.instance());

      case EDIT:
        return makeEditActivity(place);

      case CREATE:
        return makeCreateActivity();
    }

    throw new IllegalArgumentException("Unknown operation "
        + place.getOperation());
  }

Мне кажется, что мы только что вернулись на сотнюлет, если мы используем корпус переключателя с константами, чтобы сделать фабрику.Теперь это официальная, автоматически сгенерированная Spring roo 1.1 с интеграцией GWT / GAE, я не шучу

Я могу только предположить, что это пустые объявления для некоторых руководителей, потому что это определенно не Spring

Кажется, VMWareи Google были слишком быстры, чтобы что-то выдать, и не совсем закончили, не так ли?

Я что-то упустил или это наполовину испечено, и, безусловно, не должен работать Spring + GWT MVP?

У вас есть лучший пример того, как Spring, GWT (подход 2.1 MVP) и GAE должны соединяться?Я бы не хотел заниматься всеми делами, связанными с управлением историей и подобными действиями.(без аннотаций? IOC?)

Я бы тоже не хотел изобретать велосипед и писать свое собственное улучшение Spring, просто чтобы найти кого-то, кто сделал то же самое или, что еще хуже, узнать, что SpringSource и Google скоро выпустят roo 1.2и сделай все правильно

1 Ответ

2 голосов
/ 17 февраля 2011

Я не очень часто использую Roo, поэтому могу только догадываться.Код, который вы цитировали, выглядит в основном как соответствующая часть в примере приложения со страницы «Разработка GWT MVP с действиями и местами» *1002* страница документации (Примечание: я не вставлял комментарии, онииз примера кода) :

public class AppActivityMapper implements ActivityMapper {
...

 /**
  * Map each Place to its corresponding Activity. This would be a great use
  * for GIN.
  */
 @Override
 public Activity getActivity(Place place) {
    // This is begging for GIN
    if (place instanceof HelloPlace)
        return new HelloActivity((HelloPlace) place, clientFactory);
    else if (place instanceof GoodbyePlace)
        return new GoodbyeActivity((GoodbyePlace) place, clientFactory);

    return null;
 }
}

Не имеет большого значения, если используется «switch + getOperation ()» или «if + instanceof».Проблема в том, что Activity построен с оператором new.Это противоречит основам Dependency Injection.

Итак, основная вещь, которую нужно сделать с DI, это внедрить фабрики в ActivityMapper, по одному для каждого типа Place:

 public Activity getActivity(Place place) {
    if (place instanceof HelloPlace)
        return helloActivityFactory.build((HelloPlace) place);
    else if (place instanceof GoodbyePlace)
        return goodbyeActivityFactory.build((GoodbyePlace) place);

    return null;
 }

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

 Map<String, ActivityFactory> activityMap; /* injected */

 public Activity getActivity(Place place) {
    ActivityFactory factory = activityMap.get(place.getOperation());
    if (factory != null)
        return factory.build(place);

    return null;
 }

... если возможно определить универсальный интерфейс ActivityFactory, который работает с общими параметрами (например, в моем черновике build() будет использовать только place в качестве аргумента).

Теперь вот мое предположение (просто предположение!), почему чего-то такого нет в сгенерированном в Roo коде: "Разработка GWT MVP с действиями и местами" *Статья 1024 * является продолжением статьи "Разработка крупномасштабных приложений и MVP" , которая представляла MVP без DI и обещала представить будущую статью "Использование Gin для сокращения кода и облегчения тестирования".Его все еще нет, и пример кода не был обновлен для интеграции Dependency Injection.Я предполагаю, что код, сгенерированный Roo, в некоторой степени основан на этой статье, потому что это ссылка на эту тему.

...