2012-03-22 2 views
1

TDD에 대해 더 자세히 알고 싶습니다. DI에 관해서 본 모든 예제는 클래스/인터페이스로만 구현되었습니다.TDD 및 인터페이스 속성 이해

public interface IUserRepository 
{ 
    User GetByID(int ID); 
} 

public class UserRepo : IUserRepository 
{ 
    private IUserRepository Repo; 

    public UserRepo(IUserRepository repo) 
    { 
     this.Repo. = repo; 
    } 
    public User GetByID(int ID) {} 
} 

..... 

private void SetupDI() 
{ 
    container.Register<IUserRepository>.With(UserRepository); 
} 

나는 최근에 속성이있는 인터페이스를 작성하기 시작했으며 어떻게 완료 될지 확신 할 수 없으므로 중단되었습니다.

DI의 인터페이스가 OK 인 속성이 있습니까? 좋은 디자인인가요?

나는 이러한 속성과 같이 주입 될 것이라고 가정 할 것이다 :

private void SetupDI() 
{ 
    var myStringProp = GetPropValue("MyStringProp"); 
    var myIntProp = GetPropValue("MyIntProp"); 

    container.Register<IUserRepository>.With 
      (
       new UserRepository(myStringProp,myIntProp) 
      ); 
} 

답변

1

인터페이스에서 속성을 사용하는 것이 완벽하지만 인터페이스에 속성을 사용하는 것에 대한 질문이 아니라 주로 생성자와 속성 삽입에 대한 질문입니다.

클래스의 종속성이 작성 시점에 전달되어야하므로 명확하게 표시되고 "숨겨진"것이 아니기 때문에 전자 (생성자 삽입)가 분명히 선호됩니다. 개인적으로 나는 최후의 수단으로 만 생성자 주입과 속성 주입을 항상 사용하려고합니다. 다른 방법으로는 해결할 수없는 주기적 종속성이있는 경우 (당시 디자인을 다시 생각하는 것이 더 낫습니다).

+0

감사합니다. 컨테이너가 설정되었을 때 매개 변수가 프로그램의 시작 부분에 전달된다는 가정이 맞습니까? – Jon

+0

이 대답에 동의하십시오. 두 가지 모두 테스트 가능하지만 전자는 엄격하고 궁극적으로 유지 관리가 쉽습니다. – lukiffer

+0

@ 존 : 예. 의존성을 구체적인 클래스에 바인딩 할 때 매개 변수를 전달하면됩니다. 대부분의 컨테이너는 프리미티브의 매개 변수를 명시 적으로 지원합니다 (예 : 'WithConstructorArgument'를 사용하여 호출하십시오. 다른 모든 종속성은 해당 유형이 등록 된 경우 컨테이너에 의해 자동으로 해결됩니다. – BrokenGlass

0

나는 개인적으로 의존성을 주입 :

private void SetupDI() 
{ 
    var myStringProp = GetPropValue("MyStringProp"); 
    var myIntProp = GetPropValue("MyIntProp"); 

    container.Register<IUserRepository>.With 
      (
       new UserRepository() { 
       StringProperty = myStringProp; 
       IntProperty = myIntProp; 
       } 
      ); 
} 

또는

이 생성자에 필요한 모든 속성을 통과 할 것 생성자에 저장하고 private 멤버로 저장합니다. 종종, 나는 두 개의 생성자, 하나의 기본값은 응용 프로그램에서 가장 일반적으로 사용되는 것으로, 하나는 매개 변수로 종속성을 사용하는 것으로 나타납니다. 나는 이것이 단위 테스트에서 나를 돕는 것을 알았지 만 또한 나에게 유연성을 준다.