Guice를 보험 데이터 변환 플랫폼에서 사용할 준비를하고 있으며 Guice 문서 또는 내가 찾은 모든 게시에서 직접 해결되지 않는 흥미로운 시나리오가 있습니다.Guice puzzler : Batch scoped 캡슐화 된 컨텍스트
Google 플랫폼은 몇 가지 중요한 영역에서 캡슐화 된 컨텍스트 (EC) 패턴을 사용합니다. 예를 들어, 우리가 10 개의 정책 집합을 처리하고 있다고 가정합니다. 새 정책을 처리하기 시작할 때마다 PolicyContext
개체를 만들고 정책 번호, 주 및 회사와 같은 속성을 초기화해야합니다. 이 PolicyContext
은 변환 프로세스에 관련된 많은 클래스에 대한 종속성입니다.
PolicyContext
(및 기타 *Context
개체는 특정 도메인 영역에 집중되어있는 가치 객체입니다 (유비쿼터스 적으로 필요한 정책 정보를 나타냄). 비록 이들이 순전히 가치있는 물건이고 확실히 "부엌 싱크대"를 나타내지는 않지만 당신 사이의 패턴 전문가가 여전히 이것을 안티 패턴 (미시시 Hevery가 말한 바와 같이 http://misko.hevery.com/2008/07/18/breaking-the-law-of-demeter-is-like-looking-for-a-needle-in-the-haystack/)으로 생각하는지에 관심이 있습니다.
현재 우리는 최악의 방법으로 PolicyContext
을 관리하고 있습니다. 새로운 정책을 처리하기 시작할 때마다 정적 전역 변수 policyContext
및 policyContext.initialize(String company, String state, String policyNum)
이 호출됩니다.
- Guice 이전
PolicyContext
을 삭제합니다 : 즉, 개념적으로, 우리는 새로운 정책을 처리하기 시작 때마다 있도록 Guice는 구조적으로 최적의 방식으로이 상황에 맞는 객체를 관리 할 수 내 목표이다.
- Guice는
company/state/policyNum
매개 변수를 사용하여 새롭고 불변 인PolicyContext
(냄새 나는 초기화 방법이 없음)을 구성합니다. - Guice는 이미 구성된
PolicyContext
을 필요로하는 모든 클래스에 삽입합니다.- 는 배치의 경계 외부에서 결정된다 --where http://code.google.com/p/google-guice/wiki/CustomScopes에서 Guice 배치 범위 시료와 유사한 사용자 지정 범위-뭔가를 만들기 :
여기 내 임시 접근 방법이다. 이 범위에서 새 정책을 처리하기 시작하면 1) 이전 "배치"를 끝내고 새 배치를 시작할 수 있습니다. Q : Guice 배치 스코프 샘플을 앞에서 언급 한 URL과 똑같이 사용할 수없는 이유는 무엇입니까?
PolicyContext
은 종속성이 없으므로, 의 모든 생성자 매개 변수 (다소 이상하게 보임)에 AssistedInject를 사용합니다.… scope.exit(); scope.enter(); @Inject private PolicyContextFactory policyContextFactory; policyContextFactory.create(company, state, policyNum); // the parameters come from a database record. // Note that we don’t need to actually store the created instance; it will be injected elsewhere into various class constructors. …
이 최적의 보이는가 : 우리가 접근을하고 PolicyContextFactory
을 생성 가정, 우리가 새 정책을 처리하기 시작 어디에 우리가 같은 코드를 것이라고 다음? 새 정책을 처리 할 때마다 PolicyContext
특정 인젝터를 새로 만드는 등 더 간단한 방법이있을 수 있습니다. 실제로는 새로운 PolicyContext
을 만듭니다. 그러나 이것은 아키텍처의 핵심 요소이므로 절충하고 싶지는 않습니다.
또 다른 옵션은, 나도 알아,이 시나리오에서 DI를 사용하여 절제하고 단지 전자의 방법은 현재 PolicyContext
을 버리고 생성 공장은 별도의 create
및 get
방법/저장과 정적 PolicyContextManager
클래스를 사용하는 것 새로운 방법인데, 후자의 방법은 간단히 "활성"PolicyContext
을 반환합니다. 하지만 methodThatNeedsPolicyContext(PolicyContextManager.get(), …)
과 같은 코드를 많이 작성하게 될 것이므로 직접 작성하는 것이 좋습니다. 어쨌든 우리는 Guice를 사용하기 시작할 것이므로이 접근법은 최적의 것으로 보이지 않습니다.
나는 DI에 대한 깊은 이해를 기르는 사람들에게 단 가리 프라 사나의 "의존성 주입"을 강력히 추천한다. Guice와 Spring에 초점을 맞춘이 책은 필자가 만난 다른 어떤 것보다 훨씬 깊어서 절대적으로 필요했습니다.
도움 주셔서 감사합니다.
감사합니다. Jeff. 명확하게 언급하고 몇 가지 중요한 뉘앙스를 다룹니다. 몇 가지 관련 질문이 있지만 별도로 게시하겠습니다. –
+1 공급자를 주입하고 사용자 지정 범위를 만드는 데 사용됩니다. 당신은 공급자 BTW를 삽입 바인딩을 필요로 생각하지 마십시오. – RobbieV
@RobbieV Guess가'Foo'를 주입 할 수 있다면,'get for free '주석으로 언급했듯이 추가 코드없이'Provider'를 주입 할 수 있습니다. 'Foo'는 그것이 구체적인 클래스이고'Foo' 또는'Provider '에 대한 바인딩이 필요없는 경우 암시 적으로 바인딩 될 수 있습니다. 그러나'Foo'가 인터페이스 인 경우에도 여전히 어딘가에 바인딩해야합니다. 필자는 "Provider "를 삽입 할 때 위의 "Provider "를 바인드했습니다.하지만 이제는 수정되었습니다. –