2013-04-26 25 views
5

私は直接のIEnumerableを要求した場合のIEnumerableのバインディング、それが動作する設定している場合NInjectを使用しますが、他のバインドされたオブジェクトにIEnumerableが必要な場合は無効です。これは設計によるものですか?は、失敗した<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

+0

@jpierson申し訳ありませんが、私が知っていたら、私は言ったでしょう。あなたの特定の問題は何ですか?これまでに何を試しましたか?私が言うように、私は何かを知っているものを完全にオフにするが、明らかにするコードをすばやく見ることを期待する。しかし、引数仕様の中で(問題仕様に基づいて) 'Get'を使用することの提案は、すばやい回避策として機能するはずです。あなたが知っていれば、私に教えてくれるのですか?あなたは何も教えてくれませんでしたか? –

+0

あなたが知っていればよく教えてください。 – jpierson

関連する問題