1

IoC와 자동 배선에 대해 저를 괴롭히는 것은 생성 된 객체에 대한 IoC의 유용성입니다.IoC - 구성 요소 내부에서 생성 된 객체에 대한 자동 와이어링

시스템 전체에서 사용되는 정적 인 Utils 클래스가 있다고 가정 해 보겠습니다. IoC와 DI를 사용하기로 결정했을 때, 나는 쉽게 Utils를 정적이 아니게 변경하고 모든 구성 요소가 그 인스턴스를 받도록했습니다.

그러나 자동 배선은 부트 스트랩 중에 만들어진 구성 요소, 런타임 중에 생성되거나 사용자 작업의 응답으로 생성되는 개체 및 Utils를 사용하는 경우 자동 배선이 작동하지 않는 경우에만 잘 작동합니다. 대신 런타임 중에 생성되는 모든 객체의 모든 인스턴스에 Utils 인스턴스를 수동으로 전달해야합니다.

내가 볼 수있는 유일한 방법은 주위에 IoC 컨테이너를 통과시키는 방지 패턴을 사용하는 것이다.

다른 방법이 있습니까? 아니면 모든 인스턴스와 클래스에 수동으로 Utils를 전달해야합니까?

참고 : 이것은 디자인의 문제가 아닙니다. 물론, 나는이 은유적인 Utils의 사용을 다양한 방법으로 최소화 할 수 있었지만, 많은 경우에 그것은 피할 수없는 것이었다.

답변

3

내가 확실히 할 싶지 않을 것이다 의 안티 패턴 주위의 IoC 컨테이너를 통과를 사용하고 볼 수 있습니다 주위 유일한 방법.

대답은 간단합니다. 추상적 인 공장을 사용합니다.

응용 프로그램에서 팩토리 인터페이스를 정의하고 Composition Root (부트 스트 래퍼 코드)의 팩토리 구현을 정의하면 서비스 로케이터 방지 패턴 사용을 방지 할 수 있습니다. 이 팩토리 구현은 컨테이너에 대한 참조를 보유하고 인스턴스를 요청하기 위해 호출 할 수 있습니다. 해당 구현은 부트 스트랩 논리의 일부이기 때문에 해당 구현은 인프라 구성 요소이며 not using it as a service locator입니다.

예 : 자재 루트에

public interface IUnitOfWorkFactory 
{ 
    IUnitOfWork CreateNew(); 
} 

구현 :

internal class SimpleInjectorUnitOfWorkFactory 
    : IUnitOfWorkFactory 
{ 
    private readonly SimpleInjector.Container container; 

    public SimpleInjectorUnitOfWorkFactory(Container container) 
    { 
     this.container = container; 
    } 

    public IUnitOfWork CreateNew() 
    { 
     return this.container.GetInstance<IUnitOfWork>(); 
    } 
} 
+0

감사합니다. 그것은 약간의 생각 재료입니다. 내 생각 엔 [Automatic Factory] (http://blogs.msdn.com/b/stuartleeks/archive/2010/04/28/unity-2-0-automatic-builders.aspx)도 옵션일까요? – VitalyB

+0

물론,하지만 당신이 대답을 태그하지 않았기 때문에 나는 일반적인 대답을했습니다. Btw, 나는 일을 단순하게 유지하고 DI 프레임 워크의 특정 항목을 사용하지 않는 것을 좋아합니다. 실제로 일을 단순하게하지 않는 한 (적은 코드는 그 자체로 단순하지 않습니다). – Steven

+0

좋은 지적. 나는 단결을 사용하여 질문을 그런 것으로 표시했습니다. DI 프레임 워크를 사용하지 않습니까? DI를 수동으로 수행하는 것은 어려운 일이 될 수 있습니다 ... 여러 구성 요소가있을 때 각각 다른 생성자 매개 변수가 필요합니다 (그리고 DI 프레임 워크의 평생 지원은 언급하지 않았습니다) ...하지만 다시 한 번 초보자입니다. DI와 함께, 내 의견은 아직 바뀔지도 모릅니다. 감사! – VitalyB

관련 문제