2014-12-03 10 views
1

내 웹 API에서 Ninject를 사용하고 있습니다. 나는 다음과 같은 문제가있다. 두 개의 API 컨트롤러 (ControllerA와 ControllerB)가 있다고 가정 해 봅시다. 둘 다 MyClass에 의존하고 MyClass는 ClientFactory에 의존하고 ClientFactory는 Resolver에 의존합니다.Ninject는 컨트롤러 기반의 종속성을 주입합니다.

public class MyClass 
{ 
    public MyClass(IClientFactory clientFactory) 
    { ... } 
} 

public interface IClientFactory 
{ 
    Client CreateClient(); 
} 

public class ClientFactory : IClientFactory 
{ 
    private readonly IResolver _resolver; 
    public ClientFactory(IResolver resolver) 
    { 
     _resolver = resolver; 
    } 

    ... 
} 

public class ResolverA : IResolver 
{ 
} 

public class ResolverB : IResolver 
{ 
} 

public ControllerA : ApiController 
{ 
    public ControllerA(MyClass myClass) 
    { 
    ... 
    } 
} 

public ControllerB : ApiController 
{ 
    public ControllerB(MyClass myClass) 
    { 
     ... 
    } 
} 

I는 MyClass에 ControllerB가 주입되는 경우가 MyClass에 ClientFactory에 ControllerA 및 ResolverB 주입시에 ClientFactory ResolverA를 사용하려는 것이다. Ninject로 구성 할 수 있습니까?

감사합니다.

+0

문맥 적 바인딩을 보았습니까? https://github.com/ninject/ninject/wiki/Contextual-Binding –

답변

0

키워드는 "문맥 바인딩"이며, ninject wiki here에 문서화되어 있습니다. 특정 유스 케이스는 기본적으로 지원되지 않습니다. .WhenIsInjectedInto<T>이 있지만 직접 부모가 항상 MyClass (귀하가 .WhenHasAncestorOfType<T>()과 같은 것을 찾고 있기 때문에)은 좋지 않습니다. 그래서 당신은 당신의 자신의 롤이 : 물론

kernel.Bind<IResolver>() 
    .To<ResolverA>() 
    .WhenAnyAncestorMatches(x => x.Binding.Service == typeof(ControllerA)); 

kernel.Bind<IResolver>() 
    .To<ResolverB>() 
    .WhenAnyAncestorMatches(x => x.Binding.Service == typeof(ControllerB)); 

는 컨트롤러가 실제로 당신이 x.Binding.Service == typeof(...) 부분을 적용해야 할 수도 있습니다 요청 방법에 따라. 아이디어/안내를 위해 .WhenIsInjectedInto의 구현을 살펴볼 수도 있습니다.

+0

감사합니다. 그것은 작동합니다. – partyelite