2013-08-23 1 views
4

이것은 스핀 오프 this closed question입니다. 응답이 있었지만 응답을하기 전에 닫혔습니다. 다음은 질문의 수정 된 버전입니다.특별한 작업을하지 않는 내부 생성자가있는 이유는 무엇입니까?

클래스에 속성을 설정하는 내부 생성자가있는 이유는 무엇입니까? 이것의 장점을 무엇

public class SomeClass 
{ 
    public SomeClass() : this(new SomeOtherClass()) { } 
    internal SomeClass(SomeOtherClass c) { _someField = c; } 

    private SomeOtherClass _someField; 

    protected void SomeMethod() { 
     var foo = _someField.Bar(); 
    } 
} 

, 왜 그냥 할 것 :

public class SomeClass 
{ 
    public SomeClass() { _someField = new SomeOtherClass(); } 

    private SomeOtherClass _someField; 

    protected void SomeMethod() { 
     var foo = _someField.Bar(); 
    } 
} 
+5

이 패턴은 * Poor Man 's Dependency Injection *으로도 불리며 전체 안티 패턴입니다. –

+0

어셈블리/라이브러리 내에서 클래스를 특수하게 내부적으로 사용하거나 만들었지 만 제 3자가 소비하는 다른/제한된 방법을 노출하고자 할 때도 사용할 수 있습니다. 이 경우, 아마도'SomeOtherClass'의 기존 인스턴스를 사용할 수있는 내부 팩토리가있을 것입니다. 그러나 제 3자가'SomeClass'를 만들고자한다면 그들은 디폴트 생성자를 사용해야 만하고'SomeOtherClass'의 새로운 인스턴스를 생성하게해야합니다. –

답변

6

이 같은 protected 또는 internal 생성자를 갖는 것은 매우 이것에 대한 일반적인 Dependency Injection와 함께 테스트를하고있다. 당신은 일반적으로 코드를 호출 할 때

은 그냥 당신이 당신의 단위 테스트를 실행할 때 그러나 당신이 그것을 시뮬레이션 SomeOtherClass의 조롱 버전을 통과 할 수 SomeOtherClass의 인스턴스를 생성 (SomeOtherClass는 데이터 레이어 인터페이스라고 할 수 있습니다 및 SomeClass은 당신입니다 비즈니스 로직 계층 클래스는 조롱 클래스는 DB에 전화를 가짜 그리고는 DB에 연결 된 것처럼

internal class UnitTest 
{ 
    [Fact] 
    public TestDbInterface() 
    { 
     var someClass = new SomeClass(new MockedSomeOtherClass()) 

     var result = someClass.SomeMethod() 

     Assert.AreEqual("42", result); 
    } 
} 

이 당신이에 설정 같은 고가의 작업을하지 않고 단위 테스트를 수행 할 수 있습니다) 결과를 반환 알려진 상태를 검사하고 테스트 컴퓨터에서 전체 데이터베이스 서버를 실행하여 cl에 지정되지 않은 테스트를 테스트합니다. 데이터 레이어에 대한 엉덩이.

+0

네가 오기 전에 모두가 내 질문을 끝내기가 너무 좋지 않았다. 오 잘, 설명 주셔서 감사합니다 :) – Heki

관련 문제