在设置我的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}}
一次为绑定指定多个目标,而不是多行?
答案 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)