2013-02-25 2 views
3

나는 다음과 같은 공급자를 가지고 :Guice 제공자에게 주입 및 보조 매개 변수를 전달하는 방법은 무엇입니까?

내가 "기본"으로 어노테이션 WebResource 주입을 바인딩하고 "기타"로 어노테이션 WebResource 주입을 바인딩이 제공 한 2 개 인스턴스를 만들 필요가
public class GuiceResourceProvider implements Provider<WebResource> { 

    @Inject 
    private Configuration configuration; 
    @Inject 
    private Environment environment; 

    private String name; 

    @Inject 
    public GuiceResourceProvider(@Assisted("name") String name) { 
     this.name = name; 
    } 

    @Override 
    public WebResource get() { 
     if (name == "default") { 
      String connectionsDSResourceUrl = "http://localhost:" + this.configuration.getHttpConfiguration().getPort(); 
      Client connectionsDSHttpClient = new JerseyClientBuilder().using(this.configuration.getHttpClientConfiguration()).using(this.environment).build(); 
      connectionsDSHttpClient.addFilter(new RequestIdClientFilter()); 
      return connectionsDSHttpClient.resource(connectionsDSResourceUrl); 
     } else if(name == "other"){ 
      return ...... 
     } 
    } 
} 

.

다음과 같이 Guice는 공급자 인스턴스를 생성하는 분들께 :

bind(WebResource.class).annotatedWith(Names.named("default")).toProvider(GuiceResourceProvider.class).in(Scopes.SINGLETON); 
bind(WebResource.class).annotatedWith(Names.named("other")).toProvider(GuiceResourceProvider.class).in(Scopes.SINGLETON); 

그것은 주입 된 매개 변수에 대한 확인이다하지만 내가 정의를 제공 할 수 없습니다. 인스턴스를 수동으로 인스턴스화하고 사용자 지정 매개 변수를 제공하려고하면 물론 주입 된 것들이 문제가됩니다. Assisted 표기법을 따르는 경우, 문제는 모듈의 제공자 팩토리를 삽입해야한다는 것입니다. 물론 이것은 완전히 해제되었습니다!

아무도 도와 줄 수 있습니까?

+0

확실하지 이름 == "기본"'하면'당신에게 원하는 결과를 줄 것이다 :

는 업체입니다. – frugalcoder

답변

1

잘못 여기에 몇 가지가 있습니다

  • ==로 문자열을 비교 equals과 비교하지 마십시오. ==은 참조로 비교되지만 두 개는 동일한 문자열의 다른 인스턴스에 대한 참조 일 수 있습니다.
  • 공급자는 인수가없는 팩토리입니다. 공장이있는 경우 제공자가 필요하지 않습니다.
  • 보조 주입은 @Named과 같은 바인딩 주석과는 다른 시스템입니다. 바인딩 주석은 공급자를 찾기위한지도 키의 절반에 불과합니다 (Class 또는 TypeLiteral이 나머지 절반 임). Assisted injection을 사용하면 주입 시간에 하나 이상의 매개 변수를 가져 와서 자동으로이 작업을 수행하는 인터페이스를 연결할 수 있습니다. Assisted-injection 매개 변수는 단일 팩토리 메소드에서 둘 이상의 동일한 매개 변수 유형을 허용하는 경우에만 @Assisted("foo") 주석을 사용합니다. 그렇지 않으면 Guice가 알아낼 수 있습니다.
  • 삽입하는 종속성 내에서 바인딩 주석의 매개 변수 값을 읽는 좋은 방법은 없지만 서로 다른 매개 변수 값을 가진 바인딩 주석이 서로 같지 않으므로 각각을 개별적으로 바인딩 할 수 있습니다.

나는 당신의 논리가 @Provides 방법에 가장 좋은 볼 것이라고 생각 :

public class WebResourceModule extends AbstractModule { 

    @Override public void configure() { } 

    @Provides @Named("default") @Singleton WebResource makeDefaultResource(
     Configuration configuration, Environment environment) { 
    String connectionsDSResourceUrl = "http://localhost:" + this.configuration.getHttpConfiguration().getPort(); 
    Client connectionsDSHttpClient = new JerseyClientBuilder().using(this.configuration.getHttpClientConfiguration()).using(this.environment).build(); 
    connectionsDSHttpClient.addFilter(new RequestIdClientFilter()); 
    return connectionsDSHttpClient.resource(connectionsDSResourceUrl); 
    } 

    @Provides @Named("other") @Singleton WebResource makeOtherResource(
     YourDependencies here) { 
    return somethingElse(); 
    } 
} 

그러나 사용자 정의 공장 로직 어떤 문자열을하려는 경우, 단지 아무튼 단일 방법 주사 클래스를 생성 Provider을 구현하고이를 사용하여 원하는 WebResource을 만들고 반환하십시오.

+0

시간 내 주셔서 감사합니다. 그러나 귀하의 답변은 전혀 도움이되지 않았습니다. 당신은 본질적으로 "복잡한 일을하려고하지 마십시오. 그것이 어떻게 작동하는지 이해하지 못하는 것 같아서 간단하게 말하십시오"라고 말합니다. 음, 그렇지 않습니다. 나는 내가 @provides 메소드를 사용할 수 있음을 안다. 사실, 이것은 나의 첫 번째 버전이었고, 꽤 잘 작동했다. 하지만 이제 조건을 기반으로 프로 바이더와 관련 바인딩을 프로그래밍 방식으로 만들어야하기 때문에 리팩토링을 시도하고 있습니다. 물론 이는 제공하는 메서드를 사용하여 특수 구문을 사용하여 수행 할 수 없습니다. – crazypit

+0

그건 내가 말하는 것이 아니야. 겸손 해지면 유감스럽게 생각합니다. 복잡한 솔루션은 더 간단한 것이 충분하지 않은 한 괜찮습니다. 필자는 명시된 문제에 대한 제안 된 솔루션과 '@Assisted ("name")'@ Named'주석에 액세스하는 데 결코 작동하지 않지만 컴파일시 매개 변수를 거치므로 공통 제공자의 인스턴스에 키를 바인딩하는 것은 의미가 있습니다. –

4

관심있는 모든 사람들에게 대답을 찾았습니다. 삽입 된 및 사용자 지정 매개 변수를 모두 Provider로 전달하려면 생성자에서 삽입 된 매개 변수를 필드로 이동하고 생성자를 사용하여 고유 한 매개 변수를 전달하십시오. 바인딩 할 때 먼저 생성자에 매개 변수를 전달하는 Provider 인스턴스를 만든 다음이 인스턴스에 대한 requestInjection을 호출하여 주입 그래프에 추가 한 다음 다음과 같이 Provider 인스턴스에 클래스를 바인딩합니다.

GuiceResourceProvider guiceResourceProvider = new GuiceResourceProvider("default"); 
requestInjection(guiceResourceProvider); 

toProvider (guiceResourceProvider) .in (Scopes.하나씩 일어나는 것);

public class GuiceResourceProvider implements Provider<WebResource> { 

@Inject 
private Configuration configuration; 
@Inject 
private Environment environment; 

private String name; 

@Inject 
public GuiceResourceProvider(String name) { 
    this.name = name; 
} 

@Override 
public WebResource get() { 
    if (name == "default") { 
     String connectionsDSResourceUrl = "http://localhost:" + this.configuration.getHttpConfiguration().getPort(); 
     Client connectionsDSHttpClient = new JerseyClientBuilder().using(this.configuration.getHttpClientConfiguration()).using(this.environment).build(); 
     connectionsDSHttpClient.addFilter(new RequestIdClientFilter()); 
     return connectionsDSHttpClient.resource(connectionsDSResourceUrl); 
    } else if(name == "other"){ 
     return ...... 
    } 
} 

}

+0

"보조 분사"는 구성 시간이 아니라 분사 시간에 매개 변수를 받아들이는 것을 의미하는 경향이 있음을 명심하십시오. 이것은 설정시 알려진 유한 키 세트를 제공하기 위해 일반 제공자를 리팩토링하는 합리적인 솔루션입니다. –

+0

네, 맞습니다. 그럼에도 불구하고 제공자에게 매개 변수를 전달하려는 경우 보조 표기법을 사용할 수 있다고 언급 한 참고 문헌 (책에서 하나)을 발견했습니다. 그러나 예제는 제공되지 않습니다. – crazypit

관련 문제