Ninject注入错误的类型

时间:2014-09-24 23:57:11

标签: dependency-injection ninject

我有一个类型为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; }
    }
}

1 个答案:

答案 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