Сервисный локатор в стиле Guice
-
07-07-2019 - |
Вопрос
Кто-нибудь когда-либо видел / пытался написать шаблон локатора сервиса, который использует систему конфигурации стиля Guice?
В настоящее время у меня есть проект GWT (который использует GWT-RPC), в котором используется шаблон команды, в котором мой RPC-сервлет выглядит следующим образом ...
public interface TransactionService extends RemoteService {
<T extends Response> T execute(Action<T> action);
}
В моей текущей реализации метода execute я делаю это ...
if(action instanceof SomeActionImpl){
doSomeActionImpl((SomeActionImpl)action);
}else if(action instanceof SomeActionImpl2){
doSomeActionImpl2((SomeActionImpl2)action);
}
Я хотел бы найти способ избавиться от гигантского оператора if. Мне понадобится какой-то способ регистрации того, что класс ActionImpl1 должен быть делегирован другой реализации TransactioNService.
Есть идеи? Я думал просто добавить записи в HashMap, где ключ - это класс Action, а значение - это класс ServiceImpl. У меня есть ссылка на класс ServiceImpl, который я мог бы использовать Guice для получения экземпляра TransactionService.
Решение
Посмотрите на класс net.customware.gwt.dispatch.server.DefaultActionHandlerRegistry в gwt-dispatch ( http://code.google.com/p/gwt-dispatch/ ); он делает именно то, что вы предлагаете. Вот переменная-член, которая хранит обработчики:
приватная финальная карта < Class < ;? extends Action <? > > ;, ActionHandler <?,? > > Обработчики; р>
Если вы хотите выполнить обработчики на стороне сервера, используйте компоненты на стороне сервера gwt-dispatch; если это на стороне клиента, подумайте о моделировании вашего класса диспетчеризации в DefaultActionHandlerRegistry.