2011-03-13 7 views
0

나는 연구를 수행 했으므로 내가하고 싶은 일에 대한 구체적인 예를 찾을 수 없습니다.리포지토리 "Generator"가있는 종속성 삽입

나는 Ninject를 나 MVC 프로젝트에 성공적으로 구현했다. 모든 것이 완벽하게 작동합니다. 그러나 나는 마지막 단계를 원한다.

지금까지, 나는이 (정상 DI 패턴)처럼 작동되었습니다

public class myController : Controller 
{ 
    private iMyInterface myRepository; 

    public myController(iMyInterface myRepository) 
    { 
     this.myRepository = myRepository; 
    }   

    public ActionResult list(){ 
     return view(myRepository.getMyList()) 
    }   

    // rest o the code ... 
} 

내 질문입니다; 이런 식으로 할 수있는 방법이 있습니까? (Repository "Generator")

public class myController : Controller 
{ 
    private iMyInterface myRepository = specialClass.GetMyRepository(); 

    public ActionResult list(){ 
     return view(myRepository.getMyList()) } 

    // rest o the code ...  
} 

나는 말도 안되는 코드를 작성했지만, 비슷한 생각을 할 수 있습니다.

권장 사항은 무엇입니까?

+3

이 문제의 배경은 무엇입니까? 현재의 솔루션이 괜찮은 것 같습니다. 그렇다면 왜 디자인과 같은 서비스 탐지기로 변경해야합니까? –

+3

첫 번째 예는 단위 테스트가 훨씬 쉬울 것입니다. – Ryan

답변

5

무엇을 specialClass으로해야할지 모르겠다. 그러나 이것은 실제로 Service Locator anti-pattern처럼 보입니다.

그것은 당신에게 더 많은 옵션을 제공하기 때문에 저장소가 specialClass 사용을 포함, 더 생성자를 통해 주입되는 첫 번째 옵션 :

var controller = new myController(specialClass.GetMyRepository()); 

내가 Ninject에 모르겠지만, 대부분의 DI 컨테이너는 인터페이스의 인스턴스를 반환하는 메소드 호출에 인터페이스를 매핑하는 옵션을 제공합니다.

+0

감사! 멋진 기사 ... – epaulk

0

나는 생성자에서 저장소 "Generator"를 가져오고 싶습니다. 그것은 똑같은 결과를 줄 것입니다. 그러나 올바른 주사를합니다.

+2

아니요, 그것은 Leaky Abstraction이 될 것입니다. 예 : http://stackoverflow.com/questions/4648318/dependency-injection-new-instance-required-in-several-of-a-classes-methods/4650050#4650050 비슷한 질문과 이유에 대한 설명은 새는 추상화. –

+0

개인적으로 고전적인 의존성 주입 방식을 선호합니다 http://martinfowler.com/articles/injection.html – Tengiz