C# 基于控制器的Ninject注入依赖项

C# 基于控制器的Ninject注入依赖项,c#,asp.net-web-api,ninject,ninject.web,C#,Asp.net Web Api,Ninject,Ninject.web,我正在web api中使用Ninject。我有以下问题。假设有两个api控制器ControllerA和ControllerB。两者都依赖于MyClass,MyClass依赖于ClientFactory,ClientFactory依赖于解析器 public class MyClass { public MyClass(IClientFactory clientFactory) { ... } } public interface IClientFactory { Clien

我正在web api中使用Ninject。我有以下问题。假设有两个api控制器ControllerA和ControllerB。两者都依赖于MyClass,MyClass依赖于ClientFactory,ClientFactory依赖于解析器

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)
    {
       ...
    }
}
当MyClass被注入ControllerA时,我想在ClientFactory中使用ResolverA,当MyClass被注入ControllerB时,我想在ClientFactory中使用ResolverB。可以用Ninject配置吗


谢谢。

可以这样说,关键字是上下文绑定,这在ninject wiki中有文档记录。 但是,您的特定用例不支持开箱即用。有.whenIsinjectedTo,但这不好,因为在您的情况下,直接父对象总是您要查找的MyClass,类似.whenSancestorofType。 因此,您必须推出自己的:

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。。。部分您还可以查看.whenisInjectedTo的实现,以获取想法/指导。

您看过上下文绑定吗