2011-05-04 4 views
5

몇 가지 다른 책임이있는 WCF 서비스가 있지만 코드와 상호 작용하는 모든 사용자에게 하나의 진입 점이 있습니다. 간단하게하기 위해, 2 가지 방법IOC 컨테이너 - WCF 서비스 - 생성자를 통해 모든 종속성을 인스턴스화해야합니까?

private IMethodAHelper _methodA; 
    private IMethodBHelper _methodB; 

    public MyService(IMethodAHelper methodA, IMethodBHelper methodB) 
    { 
     _methodA = methodA; 
     _methodB = methodB; 
    } 

    public void MethodA() { 
     _methodA.CallThis(); 
    } 

    public void MethodB() { 
     _methodB.CallThis(); 
    } 

소비자가 단 하나의 이유는, MethodA 또는 MethodB에 대한 서비스를 호출하기 때문에, 그것은 IOC 컨테이너가 모든 종속성을 회전 불필요하게 될 것이라는 문제가있는 가정 해 봅시다? 하나의 엔트리 포인트를 제공하고자하므로 서비스를 분할하고 싶지는 않지만 서비스의 각 소비자가 하위 집합 만 필요할 때 모든 종속성을 끌어 올리는 것은 약간의 낭비입니다.

내가이 일을 생각하는 또 다른 방법은 많이 힘들어 단위 테스트를 작성 할 수 있습니다, 그러나,

public void MethodA() { 
     var methodA = ObjectFactory.GetInstance<IMethodAHelper>(); 
     methodA.CallThis(); 
    } 

이 그것을 필요로하는 의존성을 가지고 각각의 "경로"를 수 같은 것입니다. 누구든지 어떤 제안이 있습니까? 모든 종속성을 끌어 올리는 것이 얼마나 큰 이슈입니까? 이 서비스에 대한 첫 번째 진입 점이 끝나면 생성자를 통해 종속성을 주입하는 것이 타당하지만이 첫 번째 진입 점에서 권장되는 접근 방법은 무엇입니까?

답변

2

Mark Sais와 같이 작성하는 데 비용이 많이 드는 실제 prof (프로파일 러에서 가져온 시간)가 없으면 사용하지 않는 종속성을 만들지 않아도됩니다. 구성 요소를 작성하는 데 비용이 많이들 경우 AutoFac과 같은 지연 주입을 지원하는 컨테이너를 사용할 수 있습니다. 그렇게하면 첫 번째 사용시에만 생성되는 Lazy를 주입 할 수 있습니다.

1

내가하는 일에 대해 자세히 알지는 못하지만 별도의 서비스로 나누는 것이 더 합리적 일 수 있습니다.

2

의존성 주입에 대한 일반적 경험 법칙은 클래스가 올바르게 작동해야하는 모든 (필수) 종속성을 생성자 주입을 통해 주입해야한다는 것입니다.

모든 (선택 사항) 의존성은 속성 주입을 통해 주입되어야합니다. 클래스가 인터페이스의 기본 구현을 제공하고 실행 또는 구성시 인터페이스 구현을 변경하려는 경우이 경우 선택 사항입니다.

어쨌든 나는 Mark Seemann의 답변에 동의합니다.

관련 문제