2014-12-03 47 views
1

我在我的web 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) 
    { 
     ... 
    } 
} 

我想用ResolverA在ClientFactory時MyClass的注入ControllerA和ResolverB在ClientFactory時MyClass的注入ControllerB。可以用Ninject配置嗎?

謝謝。

+0

你看過上下文綁定了嗎?https://github.com/ninject/ninject/wiki/Contextual-Binding – 2014-12-03 10:36:49

回答

0

它可以(關鍵字是「上下文綁定」,它記錄在ninject wiki here中)。 但是,您的特定用例不支持開箱即用。有.WhenIsInjectedInto<T>,但這並不好,因爲在你的情況下,直接父母總是MyClass(你正在尋找類似.WhenHasAncestorOfType<T>()的東西)。 所以,你必須推出自己:這取決於控制器實際上是如何要求你可能需要適應x.Binding.Service == typeof(...)部分

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

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

當然。您也可以查看.WhenIsInjectedInto的實施方案以獲取想法/指導。

+0

謝謝。有用。 – partyelite 2014-12-03 11:10:56