Nano Hash - криптовалюты, майнинг, программирование

Как удалить привязку с помощью переопределения модуля Guice?

Итак, согласно моему тестированию, если у вас есть что-то вроде:

Module modA = new AbstractModule() {
    public void configure() {
        bind(A.class).to(AImpl.class);
        bind(C.class).to(ACImpl.class);
        bind(E.class).to(EImpl.class);
    }
}

Module modB = New AbstractModule() {
    public void configure() {
        bind(A.class).to(C.class);
        bind(D.class).to(DImpl.class);
    }
}

Guice.createInjector(Modules.overrides(modA, modB)); // gives me binding for A, C, E AND D with A overridden to A->C.

Но что, если вы хотите удалить привязку для E в modB? Кажется, я не могу найти способ сделать это без необходимости разбивать привязку для E на отдельный модуль. Есть ли способ?

18.05.2010

  • Возможно, просто глупая идея, но вы пробовали привязать (E.class).to (E.class)? (Можете ли вы даже привязать интерфейс к другому интерфейсу?) 18.05.2010
  • Да, вы можете бесконечно привязывать 1 привязку к другой привязке, если конечная точка привязки указывает на конкретный класс или поставщика. Что касается bind(E.class).to(E.class), я сообщил об ошибке 3 года назад, и она появится в версии 2.1. code.google.com/p/google-guice/issues/ подробно?id=171 18.05.2010

Ответы:


1

Это может сделать SPI. Используйте Elements.getElements(modA, modB), чтобы получить список объектов Element, представляющих ваши привязки. Переберите этот список и удалите привязку, ключ которой вы хотите удалить. Затем создайте модуль из отфильтрованных элементов, используя Elements.getModule(). Собираем все вместе:

public Module subtractBinding(Module module, Key<?> toSubtract) {
  List<Element> elements = Elements.getElements(module);

  for (Iterator<Element> i = elements.iterator(); i.hasNext(); ) {
    Element element = i.next();
    boolean remove = element.acceptVisitor(new DefaultElementVisitor<Boolean>() { 
      @Override public <T> Boolean visit(Binding<T> binding) { 
        return binding.getKey().equals(toSubtract);
      }
      @Override public Boolean visitOther(Element other) {
        return false;
      }
    }); 
    if (remove) {
      i.remove();
    }
  }

  return Elements.getModule(elements);
}
18.05.2010
  • Ух ты, сколько волшебного кода для чего-то такого простого. Это, безусловно, работает. Спасибо! 18.05.2010
  • Если вы хотите что-то более лаконичное, замените посетителя экземпляром Binding и приведением. Я предпочитаю подход без приведения, но чистый эффект будет таким же. 18.05.2010

  • 2

    Guice 4.0beta вернет список элементов только для чтения. Поэтому я изменяю код Джесси Уилсона следующим образом. Что вам нужно сделать, это предоставить список модулей и вычесть целевую привязку, которую вы хотите заменить.

    Injector injector = Guice.createInjector(new TestGuiceInjectionModule(), Utils.subtractBinding(new GuiceInjectionModule(),Key.get(IInfoQuery.class)));
    

    Функция

    public static Module subtractBinding(Module module, Key<?> toSubtract) {
        List<Element> elements = Elements.getElements(module);
    
        return Elements.getModule(Collections2.filter(elements, input -> {
            if(input instanceof Binding)
            {
                return !((Binding) input).getKey().equals(toSubtract);
            }
    
            return true;
        }));
    }
    
    06.02.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..