C# 基于控制器的Ninject注入依赖项
我正在web api中使用Ninject。我有以下问题。假设有两个api控制器ControllerA和ControllerB。两者都依赖于MyClass,MyClass依赖于ClientFactory,ClientFactory依赖于解析器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
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的实现,以获取想法/指导。您看过上下文绑定吗