当我为IEnumerable设置绑定时使用NInject时,如果我直接请求IEnumerable,它将起作用,但如果另一个绑定对象需要IEnumerable则不行。这是设计吗?
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;
}
}
答案 0 :(得分:4)
您看到Multi Injection正在发生。
您可以通过向绑定添加显式Get来覆盖它:
k.Bind<IFoo>().To<Foo>()
.WithConstructorArgument( "vals", ctx=>ctx.Kernel.Get<IEnumerable<int>>());
(虽然如果你看一下来源,我相信你会找到一种抑制多次注射的方法。)