2014-12-17 4 views
4

ObjectFactory.GetInstance()를 사용하여 이전 인스턴스를 가져 오는 대규모 응용 프로그램이 있습니다.중첩 된 컨테이너를 사용하기 위해 ObjectFactory.GetInstance의 대규모 응용 프로그램 리팩토링

이제 생성자 삽입을 사용하여 종속성을 주입하는 올바른 방법으로 응용 프로그램으로 이동하려고합니다. 그러나 모든 코드를 한 번에 변환하는 것은 거의 불가능합니다 (일부 정적 클래스는 ObjectFactory.GetInstance를 사용하고 다른 서비스는 모든 종속성이있는 생성자가 없습니다 ...).

ObjectFactory.GetInstance 호출을 현재 중첩 된 컨테이너를 사용하는 대체품으로 대체하는 방법이 있는지 궁금합니다. 모든 ObjectFactory.GetInstance를 Ioc.GetCurrentNestedContainer(). GetInstance로 대체하여 빠르게 실행되도록합니다. 하지만 현재 활성 중첩 컨테이너를 반환하기 위해 Ioc.GetCurrentNestedContainer를 구현할 수 있습니까?

모든 클래스에 IContainer를 삽입 할 수 없으므로 (일부는 정적이거나 해당하는 생성자가 없습니다) 생성자 삽입을 사용할 수 없습니다 (아직).

DI는이 응용 프로그램의 MVC, WCF 및 작업 기반 시나리오에 사용됩니다. 나는 WCF 및 작업 기반 시나리오에 대해 이야기 할 수없는 내가 MVC (내 추천을 제공 할 수 있습니다 동안

답변

1

이 비슷한 문제로 자신을 옵션을 찾는 시간을 할애 한.

The solution to I've come across and ultimately settled for을 StructureMap의 작성자가 권장 사항을보고 후입니다 HttpContext를 결합 중첩 된 컨테이너 각 요청에 생성 및 HttpContext.Items에 저장을합니다. 당신은 IContainerHttpContext.Items에 저장된 인스턴스를 캐스팅하여 컨테이너를 참조 할 수 있습니다 여기에서.

Infact는,이 같은 솔루션은 within the StructureMap.MVC5 nuget package을 사용합니다.

이 솔루션을 염두에 두어 을 HttpContext.Items에서 중첩 컨테이너를 반환하는 자신의 공장으로 대체하는 것을 멈출 수있는 방법은 없습니다.

업데이트 : HttpContext를이 다음에에 새 컨테이너 저장을 생성하는 객체 팩토리의 자신의 인스턴스를 생성하는 것입니다 내가 알고 있어요 유일한 다른 옵션을 사용할 수없는 경우

Lazy<T>as suggested here 및 StructureMap의 Google 그룹스 페이지 here에 있습니다.

나는이 질문을 StructureMap Google 그룹스에 올릴 수있는 가능성을 제안하려고했지만, 이미 그렇게 해왔다. 열렬한 StructureMap 사용자로서 다른 제안이 귀하의 게시물에서 발생하는 것을보고 싶어하므로 자세히 살펴볼 것입니다.

+0

아쉽게도 웹, wcf, Windows 서비스 시나리오에서 코드 (예 : 비즈니스 계층)가 사용되므로 HttpContext를 기반으로하는 솔루션으로는 충분하지 않습니다. – rekna

+0

알았어, 나는 또 다른 가능성에 대한 나의 대답을 업데이트했다. 미안 나는 더 많은 도움을받을 수 없었다! –

+0

가장 큰 문제는 DI로 생성되지 않은 정적 클래스와 클래스가 될 것이라고 생각합니다. 나는 중첩 된 컨테이너를 잡을 수있는 방법을 찾지 못하고있다. – rekna