首先,我们可以保留基于约定的绑定,意思是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已显著更新,因为这个问题(和答案),其中书面
参见http://stackoverflow.com/questions/2507881/contextual-bindings-with-ninject-2-0 – 2011-03-10 14:10:17