首先,我們可以保留基於約定的綁定,意思是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