2013-08-23 4 views
2

신참 님의 질문 klaxxon.Ninject bindings 101

필자는 주입해야하는 종속성을 설명하는 다음 클래스와 인터페이스와 종속성의 구체적인 인스턴스를 주입해야하는 depender를 가지고 있습니다.

public interface IDependency { } 

public class FooDependency : IDependency { } 

public class Depender 
{ 
    [Inject] 
    public IDependency Dependency { get; set; } 

    public bool DependencyIsNull() 
    { 
     return Dependency == null; 
    } 
} 

나는 내 바인딩을 NinjectModule 인스턴스로 설정했습니다.

public class Bindings : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IDependency>().To<FooDependency>(); 
    } 
} 

다음은 종속성이 합성기에 주입되었다고 주장하는 단위 테스트 방법입니다.

[TestMethod] 
public void TestMethod1() 
{ 
    var kernel = new StandardKernel(new Bindings()); 
    var bar = new Depender(); 
    Assert.IsFalse(bar.DependencyIsNull()); 
} 

테스트가 통과 될 것으로 예상 했으므로 분명히 근본적으로 잘못된 일을하고 있지만 분명하지는 않습니다.

+0

, 당신이 무엇을 기대 않았다 또한

// option a (recommended) var kernel = new StandardKernel(new Bindings()); var bar = kernel.Get<IDependency>(); Assert.IsFalse(bar.DependencyIsNull()); // option b (not recommended.. but do-able) var kernel = new StandardKernel(new Bindings()); var bar = new Depender(); kernel.Inject(bar); // injects after the fact Assert.IsFalse(bar.DependencyIsNull()); 

을, 당신은 당신의 인터페이스 DependencyIsNull 방법이 있음을해야합니까? 이 Ninject는 .NET 런타임에 마술 적으로 연결되어 새로운 객체를 만들고이를 삽입 한 객체 생성 및 알림을 가로채는가? IoC 컨테이너는 마법의 유니콘이 아닙니다. 컨테이너/커널이 객체 그래프를 작성하고 컨테이너/커널에서 루트 객체를 요청하도록합니다. – Steven

답변

3

kernel으로 개체를 만들 수 없습니다. 모든 주입 의존해야하는 kernel에 의해 생성 될 필요가 : 그래서

public interface IDependency { 
    bool DependencyIsNull(); 
} 
+0

인터페이스가 depedency 자체를 나타내는 경우 왜 그것이 null인지 말할 방법이 있습니까? 그것은 객체 클래스에서 AmINull() 메소드를 갖는 것과 같습니다. null 인 경우 메서드를 호출 할 인스턴스가 없습니다. –

+1

그것이 잘못 명명 된 것 같습니다. 'IDependency'는이 인스턴스에서'bar'가 될 것입니다. 이것은 OP의 바인딩에있는'FooDependency' 타입입니다 ... 그것은'null'에 대한 의존성을 검사하는 구체적인 클래스입니다. 유형의 이름이 잘못 지정되었으므로 혼란 스럽습니다. –