我有一个类型为ICollection<object>
的属性的类,我正在尝试使用类型ObservableCollection<object>
的实例注入。如果我通过Get<>
获得实例,Ninject会给我正确的类型,但是如果我将它注入类中则会创建List<object>
。任何人都可以向我解释发生了什么事吗?
using Ninject;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
namespace NinjectTest
{
class Program
{
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
kernel.Bind<MyClass>().ToSelf();
kernel.Bind<ICollection<object>>().To(typeof(ObservableCollection<object>));
ICollection<object> foo = kernel.Get<ICollection<object>>();
ICollection<object> bar = kernel.Get<MyClass>().Collection;
Debug.Assert(foo is ObservableCollection<object>); // ok
Debug.Assert(bar is ObservableCollection<object>); // fails
}
}
public class MyClass
{
[Inject] public ICollection<object> Collection { get; set; }
}
}
答案 0 :(得分:2)
这是“Multi Injection”功能。
当您尝试注入数组[]
,IEnumerable<T>
,ICollection<T>
或IList<T>
时,它始终被解释为GetAll<T>
- 因此它将创建一个实例对于T
的每个绑定,并将其作为您请求的“集合”类型返回。
到目前为止,我所做的是创建特定的界面,如:
public interface IFooCollection : ICollection<Foo>
然后ctor-inject IFooCollection
。这样您就可以解决多注入功能。
当然,您也可以为可观察集合创建一个接口:
public interface IObservableCollection<T> : ICollection<T>, INotifyCollectionChanged