首先,我们能否将基于约定的绑定保留为 https://github.com/ninject/ninject.extensions.conventions(与您在示例中所做的明确的硬接线绑定相反)——我已经编辑了问题标题以反映这一点。
现在,回答您的实际问题。您似乎想要设置上下文绑定,以便能够在不同的上下文中输入适当的值。我建议以更好的示例编辑您实际尝试实现的目标可能会/得到更好的答案。
第一个问题是您使用的是 v1 语法。这是您尝试在 v2 语法中实现的示例:
class ContextualBindingsExample
{
internal class A
{
public A( double x )
{
X = x;
}
public double X { get; private set; }
}
internal class B
{
public B( double y )
{
Y = y;
}
public double Y { get; private set; }
}
[Fact]
public static ContextualBindingAllowsOneToFilterWhenInjectingIntoRoots()
{
var k = new StandardKernel();
k.Bind<double>().ToConstant( 1 ).WhenInjectedInto<A>();
k.Bind<double>().ToConstant( 2 ).When( request => request.Target.Name == "y" );
Assert.Equal( k.Get<B>().Y, 2 );
Assert.Equal( k.Get<A>().X, 1 );
}
}
上述方法(尝试Get 与您的条件情况相匹配的东西)通常是您需要的。如果没有,可以如下合成。请注意,这不是一件正常的事情,如果您确实想这样做,您可能做错了什么。
您可能还在寻找一种将东西存放在容器中然后根据过滤条件将其取出的方法。是这样的:
[Fact]
public static void BindingMetadataShouldAllowContextualFiltering()
{
var k = new StandardKernel();
k.Bind<double>().ToConstant( 2 ).WithMetadata( "a", "b" );
k.Bind<double>().ToConstant( 30 ).WithMetadata( "b", 2 );
Assert.Equal( k.Get<double>( metadata => metadata.Get<string>( "a" ) == "b" ), 2 );
Assert.Equal( k.Get<double>( metadata => metadata.Get<int>( "b" ) == 2 ), 30 );
}
请注意,这通常不是一个好主意,但同样,一个更好的问题将为您提供更好的更符合上下文的答案...
现在,我建议您在这里阅读@Mark Seemann 的评分最高的答案,以了解关键原则,这样您就不会再陷入试图理解这种低级 DI 工具诡计的杂草中!
编辑:请注意,https://github.com/ninject/ninject/wiki/Contextual-Binding 自从写下这个问题(和答案)以来已经显着更新