我有什么:
$masterArray = array(
array(80),
array(20),
array(90),
);
$highestValue = 0;
foreach($masterArray as $arr){
$highestValue = $arr[0] > $highestValue ? $arr[0] : $highestValue;
}
echo $highestValue; //echo 90;
用法:
public interface IBla
{
}
public class Bla1 : IBla
{
}
public class Bla : IBla
{
}
public class Consumer
{
private readonly IBla[] _array;
public Consumer(IBla[] array)
{
_array = array;
}
}
public static class NinjectExtensions
{
public class BindListExpression<TElement>
{
private readonly IKernel _kernel;
private readonly List<Type> _types = new List<Type>();
public BindListExpression(IKernel kernel)
{
_kernel = kernel;
}
public BindListExpression<TElement> ImplementedBy<T>() where T : TElement
{
var type = typeof(T);
_kernel.Bind<T>().To(type);
_types.Add(type);
return this;
}
public void Bind()
{
Func<TElement[]> createObjects = () =>
{
var sourceArray = new TElement[_types.Count];
for (var i = 0; i < _types.Count; i++)
{
var value = _kernel.Get(_types[i]);
sourceArray[i] = (TElement)value;
}
return sourceArray;
};
_kernel.Bind<TElement[]>().ToMethod(x => createObjects().ToArray());
_kernel.Bind<List<TElement>>().ToMethod(x => (createObjects().ToList()));
_kernel.Bind<IEnumerable<TElement>>().ToMethod(x => createObjects().ToList());
}
}
public static BindListExpression<T> ListOf<T>(this IKernel kernel)
{
return new BindListExpression<T>(kernel);
}
}
为什么Ninject在// Binds items in the given order as a list (Ninject does not guarantee the given order so I use this mechanism).
kernel.ListOf<IBla>()
.ImplementedBy<Bla1>()
.ImplementedBy<Bla>()
.Bind();
var consumer = kernel.Get<Consumer>(); // result: consumer._array is empty?! --> what is imo wrong
var array = kernel.Get<IBla[]>(); // result: Bla1, Bla --> correct
和带有参数Get<IBla[]>()
的构造函数之间产生相同的结果?
答案 0 :(得分:3)
使用构造函数注入,ninject将ctor参数IBla[]
转换为IResolutionRoot.GetAll<IBla>().ToArray()
。这就是如何实现对多次注射的支持。因此,ctor-request无法生成IResolutionRoot.Get<IBla[]>()
- 但它仍然是您可以手动执行的操作。
对于ninject转换为多次注入(AFAIR数组,IList
,IEnumerable
,而不是ICollection
)的所有集合类型都是如此。
我建议使用另一个集合接口(如ICollection
)或集合实现作为构造函数参数。这将导致ctor-injection和IResolutionRoot.Get
调用的行为一致。
答案 1 :(得分:0)
可以按特定顺序绑定数组依赖项。您只需要在Ninject
中注册它们。
_kernel.Bind<Bla1>().ToSelf();
_kernel.Bind<Bla>().ToSelf();
_kernel.Bind<IConsumer>().To<Consumer>()
.WithConstructorArgument("array",
new IBla[] {
_kernel.Get<Bla1>(),
_kernel.Get<Bla>()
});