2014-12-03 50 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