2013-04-26 35 views
5

如果我爲IEnumerable設置綁定時使用NInject,它將在我直接請求IEnumerable時起作用,但如果另一個綁定對象需要IEnumerable,則不需要。這是設計嗎?使用NInject,解析IEnumerable時注入一個ctor arg時失敗,但不是在執行Get <IEnumerable時失敗<T>>()

class Program { 
    static void Main(string[] args){ 
     var k = new StandardKernel(); 
     k.Bind<IEnumerable<int>>().ToMethod(GetInts); 
     k.Bind<IFoo>().To<Foo>(); //Has an IEnumberable<int> constructor arg 
     var works = k.Get<IEnumerable<int>>(); //returns the array of ints 
     var tst = k.Get<IFoo>(); //Empty integer array is passed in by ninject??? 
     tst.Get(); //returns an empty integer array???? 
     return; 
    } 

    public static int[] GetInts(IContext ctx){ 
     return new int[] {1,2,3,4,5}; 
    } 
} 


public interface IFoo{ 
    IEnumerable<int> Get(); 
} 


public class Foo : IFoo{ 
    private int[] _vals; 

    public Foo(IEnumerable<int> vals){ 
     _vals = vals.ToArray(); 
    } 

    public IEnumerable<int> Get(){ 
     return _vals; 
    } 
} 

回答

4

你看到Multi Injection發生。

您可以通過添加一個明確的覆蓋讓它成爲你的綁定:

k.Bind<IFoo>().To<Foo>() 
    .WithConstructorArgument("vals", ctx=>ctx.Kernel.Get<IEnumerable<int>>()); 

(但如果你看一下源,我相信你會找到一個方法來抑制多注射液)。

+0

如果您對關閉多次注入的方式有任何想法,那麼共享將受到歡迎。 – jpierson 2014-07-25 14:53:51

+0

@jpierson對不起,如果我知道,我會說。什麼是你的具體問題,你到目前爲止做了什麼?正如我所說,完全關閉不是我知道該怎麼做的事情,而是期望快速查看要顯示的代碼。但是,我建議在參數規範中使用'Get'(基於問題規範)應該用作快速解決方法。 (如果你知道'告訴我們'或者'你告訴我沒有人',你是在說「IOW」) – 2014-08-03 20:43:16

+0

好吧,告訴我們你是否知道 – jpierson 2014-09-30 18:28:25

相關問題