2009-06-04 5 views
2

COM 개체의 맨 위에 API를 작성 중이므로 COM 개체를 거의 모든 유형과 정적 메서드로 전달해야하므로 각 부분을 테스트 할 수 있습니다. 내 API.IoC 컨테이너를 사용하는 오버로드 메서드가 있음

이제 내 질문은 COM 개체를 사용하지만 대신 IoC 대신 다른 하나를 전달하는 오버로드 된 메서드가있어서 API 사용자가 전달에 대해 걱정하지 않아도됩니다. COM 개체에서 또는 오버로드 된 메서드를 제거하고 그것을 전달하는 옵션을 사용하여 해결해야합니다.

설명하기 어려운 비트 여기에 예입니다;

구성 자 예;

FooType(IComObject obj,string table) {} 
FooType(string table) : this(Ioc.Resolve<IComObject>(), table) {} 

하거나

FooType(string table) : this(Ioc.Resolve<IComObject>(), table) {} 

정적 메소드 예;

public static SomeType Create(IComObject obj,string table) 
{ // Do some work with obj} 

public static SomeType Create(string table) 
{ 
    return MyClass.Create(Ioc.Resolve<IComObject>(),table); 
} 

또는 과부하 그냥

public static SomeType Create(string table) 
{ 
    IComObject obj = Ioc.Resolve<IComObject>(); 
    return MyClass.Create(Ioc.Resolve<IComObject>(),table); 
} 

나의 가장 큰 걱정은 그냥 비뚤어진 호출하는 방법을 많이 만들 것이다. 여기에 다른 옵션이 있습니까? 아니면이 문제를 해결하는 올바른 방법입니까?

P.S 실제로 응용 프로그램에서 IComObject의 인스턴스를 전달해야 할 필요가 없어 사용자에게 부담을주고 싶지 않습니다.

+1

다음 질문에서 계속됩니다. http://stackoverflow.com/questions/947378/ioc-vs-global-variable-in-library? – jerryjvl

+0

예, 이런 종류의 오점과 발견 가능성에 대해 더 걱정합니다. –

+0

그리고 내가하고있는 일을하는 것이 맞다면. –

답변

4

의존성 주입 원리 중 하나는 클래스의 의존성을 외부 세계에 명시해야한다는 것이다. 클래스가 의존성 자체를 해결할 때 (두 번째 예제에서와 같이),이 원칙에 어긋나고 싱글 톤 서비스를 사용하는 길로 되돌아갑니다. 비록 IoC 컨테이너를 "탈출구 서비스 오브젝트 조롱을위한 "해치".

모든 개체의 생성자에 매개 변수가 전체적으로로드되는 것은 당연한 일이지만 IoC 컨테이너가 단계적으로 들어가는 곳입니다. 자동 배선을 지원하고 디자인 된대로 사용하고 있다면 일반적으로 매우 적은 인스턴스를 스스로 해결해야한다는 것을 알게됩니다. 즉, 첫 번째 오브젝트를 꺼내고 모든 종속 관계로 준비된 상태로 제공되며 모든 종속성으로 구성 할 준비가 된 것입니다. 이런 이유로 Joshua Flanagan makes the argument IoC 컨테이너는 실제로 IoC 작곡가라고해야합니다.

API 사용자에게 부담을주지 않으려면 IoC 컨테이너를 감싸는 포커스 개체가 있고 코드를 사용하여 소비되도록 구성된 인스턴스를 가져 오는 방법은 어떻습니까?

2

과부하를 허용해야하는 강력한 이유가 없다면 (과부하 및 해결) 둘 모두를 사용하면 API가 불필요하게 복잡해지고 사용자에게 잠재적 인 어려움이 발생할 수 있습니다.

"P.S 나는 정말로 사용자에게 부담을주고 싶지 않습니다."라고 말했을 때 자신의 질문에 대답했다고 생각합니다. 당신이 시험 중에 IComObject 유형의 모의 객체를 등록하고 쉽게 테스트를 실행할 수 있기 때문에

1

한쪽에서, 당신은 쉽게 모든

public static SomeType Create(IComObject obj,string table) 

같은 방법을 드롭 할 수 있습니다.
하지만 다른면에서는 SoC 및 개방/폐쇄 원칙을 위반하게됩니다. 귀하의 방법은이 경우에 너무 많이 알고 있습니다 (DI가있는 등). 디자인 (아키텍처) 측면에서 "Create (IComObject obj, string table)"와 같은 메소드를 사용하고 Ioc.Resolve()의 사용을 최소화하고 이니셜 라이저, 패브릭 또는 이와 유사한 용도로만 코드를 리팩토링하는 것이 더 낫습니다. 그리고 모든 코드를 보지 않고 이것을 리팩토링하는 방법을 설명하는 것은 매우 어렵습니다.
답변은 - 따라서 다릅니다. 이 경우 약 very good post입니다. 그것을 확인해 보라 =)

+0

+1 링크에 +1 –

1

사용자가 IComObject 인스턴스를 신경 쓰면 과부하를 만드는 것이 좋습니다.

IComObject이 사용자를위한 구현 세부 사항이고 테스트에 관심있는 사람이 유일한 경우 클래스가 내부적으로 IComObject을 인스턴스화/액세스하는 데 사용하는 간단한 팩터 리 메서드를 노출해야합니다.

일반적으로 말해 사용자가 IComObject에 신경 쓰면 과부하를 생성해도 부담이되지 않습니다. 개인적으로 개발자로서 나는 항상으로 얻을 수있는 많은 옵션을 원합니다.