문제

나는 최신 프로젝트에 뛰어 들었고 Guice를 사용했습니다. 전반적인 인상은 좋지만 머리를 잡을 수없는 문제를 겪었습니다.

배경 : 네트워크를 통해 명령을 받아들이고 해당 명령을 구문 분석 한 다음 일부 내부 데이터 구조를 수정하는 JAVA6 응용 프로그램입니다. 회사가 제조 한 일부 하드웨어의 시뮬레이터입니다. 내부 데이터 구조에 대한 변경 사항은 명령이 실제 하드웨어에 미치는 영향과 일치하므로 데이터 구조의 후속 쿼리는 이전에 실행되는 명령을 기반으로 하드웨어 상태를 반영해야합니다.

내가 직면 한 문제는 명령 개체가 해당 내부 데이터 구조에 액세스해야한다는 것입니다. 이러한 구조는 Guice에 의해 만들어지고 있습니다. 왜냐하면 하드웨어의 실제 인스턴스에 따라 다르기 때문입니다. 명령 객체는 Guice가 본질적으로 멍청한 객체로 만들어지지 않습니다. 텍스트 문자열을 수락하고 구문 분석하고 데이터 구조에 대한 메소드를 호출합니다.

내가이 모든 작업을 수행 할 수있는 유일한 방법은 Guice에 의해 해당 명령 개체를 만들고 주입을 통해 데이터 구조를 통과시키는 것입니다. 그것은 정말로 엉뚱하고 데이터 객체의 생성자를 완전히 부풀게합니다.

내가 여기서 무엇을 놓쳤습니까?

도움이 되었습니까?

해결책

의존성 주입은 배선 서비스에 가장 적합합니다. 값 객체를 주입하는 데 사용될 수 있지만 특히 해당 객체가 변한 경우 약간 어색 할 수 있습니다.

즉, 제공자를 사용할 수 있습니다 @Provides 자신을 만드는 물체를 묶는 방법.

다른 팁

명령에 응답하는 것이 HTTP 요청에 응답하는 것과 다르지 않다고 가정하면, 당신이 올바른 길을 가고 있다고 생각합니다.

HTTP 애플리케이션에서 일반적으로 사용되는 패턴은 애플리케이션의 논리를 요청의 매개 변수와 일부 백엔드가 모두 주입되는 짧은 살아있는 객체로 래핑하는 것입니다. 그런 다음 그러한 객체를 인스턴스화하고 모든 마법을 수행하는 간단하고 매개 변수없는 방법을 호출합니다.

어쩌면 스코프가 어떻게 든 당신에게 영감을 줄 수 있습니까? 바라보다 문서로 그리고 일부 코드 예제 기술 세부 사항을 읽으십시오. 코드에서는 더 덜 보입니다. 이것이 귀하의 경우에 어떻게 작동하는지 다음과 같습니다.

class MyRobot {
   Scope myScope;
   Injector i;       

   public void doCommand(Command c) {
      myScope.seed(Key.get(Command.class), 
      i.getInstance(Handler.class).doSomething();
   }
}


class Handler {
   private final Command c;
   @Inject
   public Handler(Command c, Hardware h) {
     this.c = c;
   }

   public boolean doSomething() {
     h.doCommand(c);
     // or c.modifyState(h) if you want c to access internals of h
   }
}

어떤 사람들은이 솔루션을 눈살을 찌푸렸다. 그러나 나는 적어도 두 개의 다른 프로젝트에서 과거의 Guice에 크게 의존하는 코드에서 이것을 보았다.

생성자에 약간의 가치 객체를 주입 할 수 있지만, 값 객체를 가치 객체로 생각하지 않고 클래스의 매개 변수가 행동을 바꾸는 매개 변수가 모두 의미가 있습니다.

그것은 조금 어색하고 어떤 사람들은 그런 식으로 가치있는 물건을 주입하는 데 눈살을 찌푸 렸지만, 나는 과거에 Guice에 크게 의존 한 프로젝트에서 이것을 보았고 훌륭하게 작동했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top