gpt4 book ai didi

c# - Ninject Kernel.Get 和构造函数注入(inject)之间的不同行为

转载 作者:行者123 更新时间:2023-11-30 16:06:25 24 4
gpt4 key购买 nike

我有什么:

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);
}
}

用法:

// 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

为什么 Ninject 在 Get<IBla[]>() 之间不产生相同的结果和带有参数 IBla[] 的构造函数?

最佳答案

通过构造函数注入(inject),ninject 翻译 ctor 参数 IBla[]IResolutionRoot.GetAll<IBla>().ToArray() .这就是实现多注入(inject)支持的方式。所以 ctor-request 不可能导致 IResolutionRoot.Get<IBla[]>() - 但它仍然是您可以手动完成的事情。

这对于 ninject 转换为多重注入(inject)的所有集合类型都是如此(AFAIR 数组、IListIEnumerable,但不是 ICollection)。

我建议使用另一个集合接口(interface)(如 ICollection )或集合实现作为构造函数参数。这将导致 ctor 注入(inject)和 IResolutionRoot.Get 的一致行为电话。

关于c# - Ninject Kernel.Get 和构造函数注入(inject)之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com