我可以使用WhenInjectedInto为ninject指定多个参数吗?

时间:2015-06-11 14:47:06

标签: .net dependency-injection ninject

在设置我的ninject绑定时,我使用.ToMethod指定特定连接字符串的特定参数,并使用WhenInjectedInto方法将绑定限制为特定类型:

# Django REST Framework configuration overrides
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'

}

我的问题是,我可以这样做:

{{1}}

一次为绑定指定多个目标,而不是多行?

1 个答案:

答案 0 :(得分:1)

没有开箱即用。但是你可以为When(Func<IRequest,bool>)创建自己的扩展,这正是这样做的。例如:

public static class WhenExtensions
{
    public static IBindingInNamedWithOrOnSyntax<T> WhenInjectedInto<T>(
        this IBindingWhenSyntax<T> syntax, params Type[] types)
    {
        var conditions = ComputeMatchConditions(syntax, types).ToArray();
        return syntax.When(request => conditions.Any(condition => condition(request)));
    }

    private static IEnumerable<Func<IRequest, bool>> ComputeMatchConditions<T>(
        IBindingWhenSyntax<T> syntax, Type[] types)
    {
        foreach (Type type in types)
        {
            syntax.WhenInjectedInto(type);
            yield return syntax.BindingConfiguration.Condition;
        }
    }
}

用过:

public class Test
{
    [Fact]
    public void Foo()
    {
        var kernel = new StandardKernel();

        kernel.Bind<string>().ToConstant("Hello")
            .WhenInjectedInto(typeof(SomeTypeA), typeof(SomeTypeB));

        kernel.Bind<string>().ToConstant("Goodbye")
            .WhenInjectedInto<SomeTypeC>();

        kernel.Get<SomeTypeA>().S.Should().Be("Hello");
        kernel.Get<SomeTypeB>().S.Should().Be("Hello");

        kernel.Get<SomeTypeC>().S.Should().Be("Goodbye");
    }
}

public abstract class SomeType
{
    public string S { get; private set; }

    protected SomeType(string s)
    {
        S = s;
    }
}

public class SomeTypeA : SomeType
{
    public SomeTypeA(string s) : base(s) { }
}

public class SomeTypeB : SomeType
{
    public SomeTypeB(string s) : base(s) { }
}

public class SomeTypeC : SomeType
{
    public SomeTypeC(string s) : base(s) { }
}

请注意ComputeMatchConditions是一种黑客攻击,因为它依赖于ninject内部..如果这些(WhenInjectedInto的实现)发生变化,那么这可能会停止工作。当然,您可以自由地提供自己的替代实现。您也可以复制WhenInjectedInto中的代码,请参阅:BindingConfigurationBuilder.cs method WhenInjectedInto(Type parent)