Инъекционный интерфейс с несколькими реализациями в игровой среде - PullRequest
2 голосов
/ 18 марта 2019

Я хочу внедрить Java-интерфейс, используя аннотацию @Inject, но, поскольку существует несколько реализаций этого интерфейса, я не понимаю, как решит игровая среда. Я пытаюсь найти что-то вроде аннотации квалификатора весной, но не могу найти что-токак это в игровой документации.Пожалуйста, дайте мне знать, как этого можно достичь.

interface i1 {
    void m1() {}
}
class c1 implements i1{}
class c2 implements i1{}

class c {
    @Inject 
    i1 i; // which instance will be injected here how to resolve this conflict.
}

1 Ответ

1 голос
/ 19 марта 2019

Игровые рамки используют Guice:

https://www.playframework.com/documentation/2.7.x/JavaDependencyInjection https://github.com/google/guice/wiki/Motivation

Вы можете достичь этого разными способами.Простейшие примеры:

1. Обязательные аннотации

Если вам нужна только одна реализация.https://www.playframework.com/documentation/2.7.x/JavaDependencyInjection#Binding-annotations

import com.google.inject.ImplementedBy;

@ImplementedBy(c1.class)
public interface i1 {
    void m1();
}

2. Программные привязки

Если вам нужно несколько реализаций одного и того же класса.Похоже на классификатор.Тот, который вы просили.https://www.playframework.com/documentation/2.7.x/JavaDependencyInjection#Programmatic-bindings

import com.google.inject.AbstractModule;
import com.google.inject.name.Names;

public class Module extends AbstractModule {
  protected void configure() {

    bind(i1.class)
      .annotatedWith(Names.named("c1"))
      .to(c1.class);

    bind(i1.class)
      .annotatedWith(Names.named("c2"))
      .to(c2.class);
  }
}

Позже в коде

@Inject @Named("c1")
i1 i;
...