2009-06-24 6 views
7

에 의해 다루어지지 않은 것 나는 의존성 주입을 위해 Google Guice으로 꼬박 말아서 기존 애플리케이션에 통합하기 시작했다. 여태까지는 그런대로 잘됐다. 나는 그들의 의존성, Strings, DataSources 등과 같은 많은 클래스를 필요로한다. 네임드 바인딩이 있다는 것을 알고 있지만 실제로 각 클래스의 생성자에 전달해야하는 모든 간단한 문자열에 대한 주석을 작성하고 싶지 않습니다. 그러면 AssistedInject라는 것이 있는데, 나를 위해 Factory 구현을 만듭니다. 와우,하지만 여전히 공장의 인터페이스를 정의해야합니다. 이 예제 클래스에 대한 종속성을 가지고 있습니까 클래스,하지만 괜찮 그게 전부 :Guice와의 의존성 주입 : 튜토리얼

전에서 의심 Guice 또는 더 일반적으로, DI 올바른 방법을 사용하는 방법을 나는 경우가 있습니다
public class FooBarClass { 
    public FooBarClass(String name, String anotherOne) { 
     // Some stuff 
    } 
} 

. "자주 듣겠습니다 : XYZ 프레임 워크는 새로운 입니다." 그러나 이것은 암시 적으로 인스턴스를 DI 프레임 워크로 만들어야합니다.

한 인스턴스 만

을하는 것이 무엇인가 내가이 클래스의 인스턴스를 하나만 필요한 경우? 이 클래스는 두 개의 문자열 옆에 절대적으로 종속 관계가 없습니다. Shutdown Hook에 대해 한 번만 인스턴스화되고 JVM으로 전달되는 Shutdown Hook에 대해 생각해보십시오. Guice와 함께이 인스턴스를 만들어야합니까? 주입 할 것이 없기 때문에 이것은 매우 바보 같이 보입니다. 그러나 Guide 인터페이스를 전달하는 팩토리 인터페이스를 작성해야하고 DI를 사용하기위한 FooBarClass의 인터페이스를 만들어야합니다.

여러 인스턴스가 동일한 것은 내가이 클래스의 여러 인스턴스를 필요로 경우에 적용

을해야합니다. 의존성은 없지만 아무 것도 얻을 수없는 상용구 코드를 만들어야합니다. 이것은 나에게 잘못된 것처럼 보인다.

그럼 어떻게 DI 및/또는 Guice를 사용해야합니까?

고맙습니다.

답변

23

종속성데이터에서 분할하는 것이 도움이 될 수 있습니다.

  • 종속성은 종종 데이터베이스, 시계 및 RPC 스텁과 같은 서비스입니다. 또한 이들에 계층화 된 응용 프로그램 코드는 모두 UserAuthenticator, PaymentHandlerEmailGateway입니다.
  • 데이터는 Date, Map<String,InetAddress> 또는 심지어 Customer입니다. 이들은 단순한 메모리 내 도메인 객체입니다.

DI는 당연히 사물의 종속성 측면에 가장 적합합니다. 데이터 모델 클래스에 계속해서 new을 사용해야합니다.

2

개별 고객과 같은 여러 인스턴스를 작성하는 경우 해당 인스턴스를 삽입하는 것은 의미가 없습니다. 무슨 의미가있는가?는 모든 종속성을 가진 Customer 인스턴스를 만들 수있는 @Singleton 범위 인 CustomerFactory를 만드는 것입니다.

2

특정 클래스를 테스트 할 때 복잡성을 무시 (격리)하려면 종속성을 주입하십시오. 클래스가 단지 데이터 보유자 인 경우 코드는 간단합니다 (get, set, equals). 대상 클래스를 테스트 할 때 조롱 할 필요가 없으므로 데이터 인스턴스를 주입하는 것은 잔인합니다 (일반적으로 어렵습니다).코드가 사소하지 않은 경우, 클래스는 데이터 보유자 이상의 역할을 수행하므로 유닛 테스트에서이를 주입하고 조롱해야합니다.