2010-01-02 1 views
14

Ninject와 같은 DI 프레임 워크가 기본을 지나치는 방법을 "얻으려면"좀 더 도움이 필요합니다. ...DI 프레임 워크 : 서비스 로케이터 (특히 Ninject 포함)를 사용하지 않고 주입 된 장치를 체인을 통해 지속적으로 전달하는 것을 피하는 방법

class Program { 
    public static void Main() { 
    Samurai warrior1 = new Samurai(new Shuriken()); 
    Samurai warrior2 = new Samurai(new Sword()); 
    warrior1.Attack("the evildoers"); 
    warrior2.Attack("the evildoers"); 
    } 
} 

어디 '하십시오 참조 클래스는 같이 보일 것이다 (위 즉, [주입한다] 참조)는 DI 프레임 워크없이

class Samurai { 
private IWeapon _weapon; 

    [Inject] 
    public Samurai(IWeapon weapon) { 
     _weapon = weapon; 
    } 

    public void Attack(string target) { 
     _weapon.Hit(target); 
    } 
} 

:

Ninject에 샘플을 가지고 모든 것을 새롭게하는 것. 예, 당신은 사무라이의 의존성을 없앴습니다. 그러나 이제는 사슬림을 한 단계 더 의존하게되었습니다. 단순한. Ninject에와

, 당신은에 의해 newing까지 모든 것을 없애 그러나

class Program { 
    public static void Main() { 
    IKernel kernel = new StandardKernel(new WarriorModule()); 
    Samurai warrior = kernel.Get<Samurai>(); 
    warrior.Attack("the evildoers"); 
    } 
} 

,이 혼란의 나의 영역은 다음과 같습니다 효율적으로 돌봐 서비스 로케이터의 어떤 종류를하지 않고 해당 커널을 newing와 모듈 (즉, IoC.TypeResolver.Get <>())은 무엇입니까? a) 어디서나 새로운 커널을 만들지 않는 가장 좋은 방법은 무엇입니까? (b) 더 중요한 것은, 자신의 의존성과 의존성을 가진 큰 긴 체인, 당신은 내가 심각한 반 패턴 (친구가 그것을 "핫 감자 의존성 주입"안티라고 확신 뭔가에서 모든 방법을 주입의 극단에 가져 가라. -무늬).

다른 말로하면, DI 프레임 워크 마법의 일부분은 체인의 모든 방법으로 종속성을 계속 삽입 할 필요가 없다고 생각했습니다. 즉, 생성자에서 10 개의 매개 변수를 포함하는 첫 번째 참조 체인을 따라 훨씬 더 멀리까지 할 일) - 마술 또는 내 혼란에 대한 해결책은 어디에서나 종속성이 지속적으로 참조되거나 체인을 참조하거나 서비스 로케이터 참조가 어디에나 퍼지지 못하게하는 것입니다.

DI 프레임 워크를 사용하는 경우, 참조 된 클래스에 일반적으로 생성자 (예 : 새로운 ReferencedClass (myList))에 넣을 IList가 필요한 시나리오를 처리하는 가장 좋은 방법은 무엇입니까? 문자열 데이터베이스 연결 문자열과 같은 단순한 경우를 제외하고는 아무 것도하지 않습니다. 그냥 속성을 만들고 그것/DI 프레임 워크 서비스를 찾는 그것을 새롭게 후 그것을 설정? 나는. 벽에 너무 많은 시간이 최선을 결정하기 위해 노력하고

var referencedClass = IoC.Get<IReferencedClass>(); 
referencedClass.MyList = myList; 

모두 모두, 나는 이것이 내가 아마 내가 그것을 얻을 후 약 당황있을거야 후 생각하지만 지금, 나는 내 머리 명중했습니다 접근.

+0

참조 http://stackoverflow.com/questions/367178/usage-of-ioc-containers-specifically-windsor –

+0

고마워. 이 링크는 아마도 지금까지 본 모든 내용 중 가장 좋은 요약 일 것입니다. 즉, 정적 게이트웨이/서비스 로케이터 및 DI 프레임 워크에 대한 다양한 견해가 있습니다. 나는 DI 프레임 워크가 체인을 따라 종속성을 자동으로 초기화하는 기능을 강조하면서 서비스 위치 지정자 참조를 최소화한다고 생각하고 있습니다. – Ted

답변

3

"핫 감자"종속성 문제는 이럴 필요가 없습니다. 의존성 주입 프레임 워크가 이것을 처리합니다.

예를 들어, Class1에 Class2에 대한 종속성이 있고 Class2에 Class3에 대한 종속성이있는 경우 은 Class2 종속성을 수용하기 위해 Class1에 Class3을 주입해야합니다. 커널은 종속성 체인을 따라 내려 가서 Class1을 요청할 때 다운 스트림 종속성을 자동으로 해결합니다 (모든 클래스가 커널에 등록되어있는 한).Class2의이 강좌 3

클래스 1 생성자가 모든 강좌 3을 언급 할 필요가 없습니다에 따라 달라집니다에

Class1에 따라 다르다.

두 번째 문제는 어떻게 처리되는지 또는 프레임 워크에 따라 달라지는 지 여부입니다. Ninject를 사용하면 Bind().To().WithConstructorArgument() 구문을 사용하여 새 List 항목을 생성자에 제공 할 수 있다고 생각합니다.

+0

1) 얼굴을 때리다. 이 문제에 대한 나의 테스트가 어떻게 실패했는지는 모르지만, 문제가없는 체인 연결을 처리합니다. 2) WithConstructorArgument 구문이 Ninject v2에서 변경되었지만이를 기꺼이 호출 할 수는 없습니다. 그럼에도 불구하고 고정 게이트웨이/서비스 위치 지정자가이를 설정하거나 커널을 설정할 때 커널을 참조해야하거나 런타임 전에 인수 (예 : 데이터베이스 연결 문자열)를 알아야합니다. 따라서, 나는 단지 더 연약한 느낌의 재산으로 정착하고 있습니다. 그러나 그것은 효과적이며 이전에 읽은 것과 일치합니다. – Ted

관련 문제