2011-07-05 50 views
2

我得到了小小的接口ITEST:Ninject問題越來越實例

public interface ITest 
{ 
    void DoSomething(); 
} 

和ITEST

的一些實現
public class Test : ITest 
{ 
    public void DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class Test2 : ITest 
{ 
    public void DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class Test3 : ITest 
{ 
    public void DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class Test4 : ITest 
{ 
    public void DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 
} 

現在我建立Ninject:

kernel.Bind<ITest>().To<Test>().Named("Test"); 
kernel.Bind<ITest>().To<Test2>().Named("Test"); 
kernel.Bind<ITest>().To<Test3>().Named("Test"); 
kernel.Bind<ITest>().To<Test4>().Named("Test"); 

這裏是我的第一個問題。

如果IAM試圖讓使用

ITest test = kernel.Get<ITest>("Test"); 

它會導致異常的實例「錯誤激活ITEST不止一個匹配的綁定是可用的。......」。該文檔說:「通過使用具有指定名稱的第一個綁定來獲取指定服務的實例。」

問題二:

List<ITest> servicesList = new List<ITest>(kernel.GetAll<ITest>("Test")); 

導致異常「錯誤激活字符串,不匹配的綁定是可用的,並且該類型不是自綁定...」。該文檔說:「使用以指定名稱註冊的綁定獲取指定服務的所有實例。」

任何想法?提前致謝!

回答

4

您正在給所有實例使用相同的名稱Test,所以這是不正常的。

kernel.Bind<ITest>().To<Test>().Named("Test1"); 
kernel.Bind<ITest>().To<Test2>().Named("Test2"); 
kernel.Bind<ITest>().To<Test3>().Named("Test3"); 
kernel.Bind<ITest>().To<Test4>().Named("Test4"); 

現在,您可以通過名稱獲取您的實例:

ITest test = kernel.Get<ITest>("Test3"); 

而且把他們都弄到你不再需要一個名字:

List<ITest> servicesList = kernel.GetAll<ITest>().ToList(); 
+0

註冊您的內核的時候給他們不同的名字起初=>感謝您的回答;) 對於第一個情景我必須改變我的邏輯,沒問題。但爲什麼kernel.GetAll(typeof(ITest))與kernel.GetAll ()不同? – dknaack

+0

@dknaack,除了在編譯時的強類型,'kernel.GetAll(typeof(ITest))'和'kernel.GetAll ()'在運行時返回完全相同的對象實例到結果列表中。 –

+0

kernel.GetAll ()工作得很好,但 kernel.GetAll(typeof運算(ITEST))會拋出異常「錯誤激活ITEST不止一個匹配的綁定是可用的。......」 ?爲什麼」 .Named(字符串)「存在,當我不能綁定多個類型?爲什麼kernel.GetAll(typeof(ITest))與kernel.GetAll ()不同?根據文檔,Get方法將「通過使用具有指定名稱的FIRST綁定獲取指定服務的實例」。 – dknaack