Я не очень часто использую 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, в некоторой степени основан на этой статье, потому что это ссылка на эту тему.