Google Guice: Injecting Набор объектов как зависимость [дубликат]

Мне нравится делать это, оценивая записи по некоторым столбцам. В этом случае значения ранга rev группируются по id. Те, у кого выше rev, будут иметь более низкий рейтинг. Таким образом, наивысший rev будет иметь ранжирование 1.

select id, rev, content
from
 (select
    @rowNum := if(@prevValue = id, @rowNum+1, 1) as row_num,
    id, rev, content,
    @prevValue := id
  from
   (select id, rev, content from YOURTABLE order by id asc, rev desc) TEMP,
   (select @rowNum := 1 from DUAL) X,
   (select @prevValue := -1 from DUAL) Y) TEMP
where row_num = 1;

Не уверен, что введение переменных делает все это медленнее. Но, по крайней мере, я не дважды запрашиваю YOURTABLE.

30
задан durron597 8 July 2015 в 16:12
поделиться

2 ответа

Для этого вам нужно Multibindings . В частности, вы хотите привязать Set<Action> (а не List, но Set, вероятно, вы действительно так хотите):

Multibinder<Action> actionBinder = Multibinder.newSetBinder(binder(), Action.class);
actionBinder.addBinding().to(FooAction.class);
actionBinder.addBinding().to(BarAction.class);

Затем вы можете @Inject Set<Action> где угодно.

39
ответ дан Chadwick 27 August 2018 в 21:47
поделиться

Позвольте мне показать вам, что я считаю еще лучшим способом многообразий. Если вы хотите, чтобы Action s были подключаемыми, и пусть кто-нибудь их добавляет, часто бывает полезно предоставить простой Module для кого-то, кто будет использовать эту шкуру, нуждающуюся в создании экземпляра Multibinder. Вот пример:

public abstract class ActionModule extends AbstractModule {
  private Multibinder<Action> actionBinder;

  @Override protected void configure() {
    actionBinder = Multibinder.newSetBinder(binder(), Action.class);
    configureActions();
  }

  /**
   * Override this method to call {@link #bindAction}.
   */
  protected abstract void configureActions();

  protected final LinkedBindingBuilder<Action> bindAction() {
    return actionBinder.addBinding();
  }
}

Теперь почему это лучше? Это позволяет кому-то использовать ActionModule из любого места, чтобы добавить больше Action s через стандартный API привязки. Я думаю, что это более читаемо. Вот пример использования:

public final class MyStandardActionModule extends ActionModule() {
  @Override protected void configureActions() {
    bindAction().to(FooAction.class);
    bindAction().to(BarAction.class);
    // If you need to instantiate an action through a Provider, do this.
    bindAction().toProvider(BazActionProvider.class);
    // You can also scope stuff:
    bindAction().to(MySingletonAction.class).in(Singleton.class);
  }
}

Этот шаблон использования Module, чтобы скрыть многострочный бит, используется в коде Guice. Это немного работает впереди, но держит вещи в чистоте. Вы также можете сделать что-то подобное для MapBinder, если вам нужно. Имейте в виду, что вы можете создать столько ActionModule, сколько хотите.

21
ответ дан Neeme Praks 27 August 2018 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: