1

我在我的网络 api 中使用 Ninject。我有以下问题。假设有两个 api 控制器(ControllerA 和 ControllerB)。两者都依赖于 MyClass,MyClass 依赖于 ClientFactory,ClientFactory 依赖于 Resolver。

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 配置吗?

谢谢你。

4

1 回答 1

0

它可以(关键字是“上下文绑定”,在此处的 ninject wiki 中有记录)。但是,开箱即用不支持您的特定用例。有.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想法/指导的实施。

于 2014-12-03T10:50:40.897 回答