2012-02-06 2 views
1

클래스의 인스턴스를 만드는 레거시 코드가 있습니다.IOC 컨테이너 통과를 피하는 방법

저는 IOC 컨테이너를 연결하여 어셈블리를 스캔하고 인스턴스를 생성 할 수있었습니다. 그러나 configuation 클래스에서 특정 클래스가 여러 번 생성 될 수 있음을 확인했습니다.

로직은 기본적으로 클래스 유형의 배열을 반복하며 사용자가 선택한 클래스와 일치하면 CreateInstance을 호출합니다.

괜찮습니다. 그러나이 기능을 제공하는 유일한 방법은 IOC 컨테이너를 전달하고 클래스의 새 인스턴스를 제공 할 Resolve를 호출하는 것입니다.

나는 이것이 심각하게 찡그린다는 것을 알고 있지만 어떻게 작동하게 할 것인가를 생각할 수 없다.

+0

당신이 이러한 종속성의 생성자 주입 패턴을 사용할 수없는 이유가 있습니까 : 여기에 업데이트

은 예입니다? – Dervall

+0

약 50 개의 클래스 유형이 있으며 플러그인입니다. 사용자는 플러그인을 화면에 드래그 할 수 있으며 새로운 인스턴스를 만들 때 – Jon

+0

을 생성해야합니다. 레거시 코드로 작업하기 때문에 DI 컨테이너를 사용하는 것이 합당한 첫 번째 단계 일 수 있습니다. 그러나 끝내고 싶은 부분이 아닙니다. –

답변

1

IOC 컨테이너와 새 인스턴스가 필요한 코드 사이의 추상화 계층을 제공하는 추상 팩터 리를 생성하면 코드가 컨테이너 종속 호출로 흩어지는 것을 방지 할 수 있습니다.

예를 들어 'Unity Application Block'을 사용하는 경우 Func<T>을 팩토리로 사용할 수 있습니다. 이 Func<T>은 실제로 컨테이너 구현을 숨 깁니다. 실제로는 container.Resolve<T>()입니다.

public class TestClass 
{ 
    readonly Func<Foo> _fooFactory; 

    public TestClass(Func<Foo> fooFactory) 
    { 
     _fooFactory = fooFactory; 
    } 

    public void LoadFoo() 
    { 
     var foo = _fooFactory(); // This hides the call container.Resolve<Foo>() 
     // Do something with foo 
    } 
} 
+0

저는 Autofac을 사용하고 있습니다.이 작업을 수행하는 방법을 찾고 있습니다 ... – Jon

+0

Autofac이 가능하다고 생각합니다. 이 똑같은 기능. [here] (http://stackoverflow.com/questions/4840157/does-ninject-support-func-auto-generated-factory) – Lukazoid

+0

문서를 읽었으나 나는 단지 ㅋㅋ, ㅋㅋㅋ : – Jon