2010-02-01 5 views
4

귀하의 조언은 무엇입니까?어디 guice 인젝터를 유지하려면?

저에게 가장 적합한 해결책으로 인젝터와 모듈을 열거 클래스로 유지하십시오. 장점 : 응용 프로그램을 실행하는 동안

  1. 인젝터 한번 생성 모듈
  2. 인젝터
  3. 분사 한 곳에서 보관하고 용이하게 찾아 낼 수있다 (단지 스트랩의) 다른 클래스에서 사용될 수있다.

예 :

import static ru.package.Modules.*; 

public enum Injectors { 

FOO_INJECTOR(BarModule.module()), 

FOO2_INJECTOR(FOO_INJECTOR.injector(), 
     Bar2Module.module(), FooModule.module()); 

private final Injector m_injector; 

Injectors (Module... modules) { 
    m_injector = Guice.createInjector(modules); 
} 

Injectors (Injector parentInjector, Module... modules) { 
    m_injector = parentInjector.createChildInjector(modules); 
} 

public Injector injector() { 
    return m_injector; 
} 
} 
+8

이렇게하지 마십시오. 이 전략에는 많은 문제점이 있습니다. 귀사의 프로그램을 실행할 때마다 필요한 모든 인젝터가 만들어집니다. –

답변

5

더 큰 문제는 왜?

일단 주사가 완료되면 Injector을 수행해야하며 사라져야하기 때문에 Injector을 계속 둘 필요가 없습니다.

경우에는, 그러나, 당신은 정말 당신은 단순히 Injector 없습니다 필요

@Inject 
private Injector injector; 

이 응용 프로그램 웹 기반인가 아니면 독립입니까?

+0

이 코드는 웹에서도 사용됩니다. 인젝터 주입에 관해서는 이미 질문했습니다 : http://stackoverflow.com/questions/2176216/how-to-inject-injector. 문제는 guice가 Injector를 묶거나 제공 할 수 없다는 것입니다. –

+0

ColinD에 동의해야합니다. DI 작동 방식을 이해하는 것이 유용 할 수 있습니다. 그것은 당신에게 많은 시간과 노력을 덜어 줄 것입니다. – gpampara

16

의존성 주입이 어떻게 작동하는지 근본적으로 오해하고있는 것처럼 보입니다. 응용 프로그램을 부트 스트랩하는 장소 이외의 코드에서 Injector에 대한 참조를 사용하려는 경우 종속성 주입을 사용하지 않고 서비스 로케이터로 대신 사용합니다. 클래스를 테스트 할 때마다 Injector을 준비해야하며 클래스는 의존성이 무엇인지 정확히 알지 못합니다. (어떤 메소드에서 어떤 메소드에서 벗어나야 할지를 누가 알기 때문에 또는 그것에 대한 참조를 얻을 수 있음). 실제로 여기에 설명 된대로 enum을 사용하면 모듈이 열거 형에 하드 코드되어 있기 때문에 테스트를 위해 구성을 전혀 변경할 수 없습니다.

종속성 삽입을 사용하면 클래스가 종속성 만 선언하고 Injector이 투명하게 작업하여 (루트 응용 프로그램 개체를 가져 오는 초기 호출 이후) 모든 종속성을 제공 할 수 있습니다. 따라서 코드의 이해, 테스트 및 변경 기능을 비교적 쉽게 할 수 있습니다. 어쨌든, 저는 DI와 Guice가 어떻게 사용되도록 의도되었는지에 대해 더 많이 배우고 싶습니다. 정말로 이것을하고 싶지는 않을 것입니다.

+0

저는 DI와 Guice를 처음 접했습니다. 그래서 plz는 참을성이 있습니다.) 1) 웹 어플리케이션에서 사용 되었기 때문에 런타임에 모든 의존성 그래프를 가진 객체를 할당해야합니다. 부트 스트랩에서. 2) 열거 형. 테스트 할 때마다 모듈을 변경하면 안됩니다. 테스트를 위해 별도의 모듈과 인젝터를 구성 할 수 있습니다 (필요한 경우). 3) 왜 인젝터를 루트 객체에만 사용해야합니까? 예를 들어, AOP는 어떨까요? –

+0

@ColinD 인젝터에 대한 필요성은 건설 중 DI를 수행 할 필요가 없기 때문에 런타임 중에 (런타임 디버깅 용도로 Beanshell을 통해) Singleton 인스턴스에 액세스 할 수 있기를 원하기 때문입니다. 즉, 싱글 톤을 위해 일종의 레지스트리가 필요할 것입니다. DI가 없다면 보통 정적 인 최종 필드를 사용하지만 Guice DI를 사용하면 인젝터가 레지스트리에 대한 자연스러운 선택 인 것 같습니다. – RAY

+0

종속성 그래프의 모든 곳에서 종속성 삽입을 즉시 적용하는 것이 현실적이지 않을 수있는 기존 응용 프로그램을 고려하십시오. 의존성 주입을 조금씩 도입하려고 시도하면 전략적으로 배치 된 서비스 탐지기로 인젝터를 일부 사용하게됩니다. – beluchin