Ninject:从同一个抽象类继承的GetAll实例

时间:2015-07-16 21:48:08

标签: c# inheritance dependency-injection ninject abstract-class

Ninject是否可以获取从特定抽象类继承的所有实例?例如,我有以下抽象类。

public abstract class MyAbstractClass { }

然后我有以下两个派生类,它们都继承自同一个抽象类。

public class MyDerivedClass1 : MyAbstractClass { }

public class MyDerivedClass2 : MyAbstractClass { }

现在我要将两个派生类与内核绑定,因为我希望它们在单例范围内。

_kernel = new StandardKernel();
_kernel.Bind<MyDerivedClass1>().ToSelf().InSingletonScope();
_kernel.Bind<MyDerivedClass2>().ToSelf().InSingletonScope();

我知道内核可以返回如下的实例。

_kernel.Get<MyDerivedClass1>();

有没有办法获得从MyAbstractClass继承的所有类?我尝试了以下但没有成功。

IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>();

希望上面的GetAll()方法返回两个实例的列表,一个是MyDerivedClass1,第二个是MyDerivedClass2。

3 个答案:

答案 0 :(得分:3)

目前,您只使用ToSelf绑定到实现类型,而不是基类类型。它实际上是在调用_kernel.Bind<MyDerivedClass1>().To<MyDerivedClass1>()

要将实现类型绑定到基类型,请使用:

_kernel = new StandardKernel();
_kernel.Bind<MyAbstractClass>().To<MyDerivedClass1>().InSingletonScope();
_kernel.Bind<MyAbstractClass>().To<MyDerivedClass2>().InSingletonScope();

//returns both
var allImplementations = _kernel.GetAll<MyAbstractClass>();

编辑:对单身人士的多重绑定。

_kernel = new StandardKernel();
_kernel.Bind<MyDerivedClass1>().ToSelf().InSingletonScope();
_kernel.Bind<MyDerivedClass2>().ToSelf().InSingletonScope();

_kernel.Bind<MyAbstractClass>().ToMethod(x => _kernel.Get<MyDerivedClass1>());
_kernel.Bind<MyAbstractClass>().ToMethod(x => _kernel.Get<MyDerivedClass2>());

答案 1 :(得分:2)

而不是创建两个绑定,第二个绑定到第一个“重定向”,你还可以做的是:

_kernel.Bind<MyAbstractClass, MyDerivedClass1>()
       .To<MyDerivedClass1>().InSingletonScope();
_kernel.Bind<MyAbstractClass, MyDerivedClass2>()
       .To<MyDerivedClass1>().InSingletonScope();

这更清楚地表达了意图。

答案 2 :(得分:0)

因此,如果您需要从抽象类继承单例并通过GetAll或Get使用它,则它的工作方式如下:

public abstract class Test
{
    public string Name;
    public Test(string s)
    {
        Name = s;
    }
}

public class T1 : Test
{
    public T1() : base("T1")
    {
    }
}

public class T2 : Test
{
    public T2() : base("T2")
    {
    }
}

然后:

    static StandardKernel kernel;
    static void Main(string[] args)
    {
        kernel = new StandardKernel(new LoadModule());    

        var tests = kernel.GetAll<Test>();
        tests.ToList().ForEach(c => Console.WriteLine(c.Name));
        Console.WriteLine();

        Console.WriteLine(GetByType<T1>().Name);
        var z = GetByType<T1>();
        z.Name = "abc";           
        Console.WriteLine(z.Name);
        Console.WriteLine(GetByType<T1>().Name);

        Console.WriteLine();

        Console.WriteLine(GetByType<T2>().Name);
        var za = GetByType<T2>();
        za.Name = "abc";
        Console.WriteLine(za.Name);
        Console.WriteLine(GetByType<T2>().Name);

        Console.WriteLine();

        tests = kernel.GetAll<Test>();
        tests.ToList().ForEach(c => Console.WriteLine(c.Name));
        Console.WriteLine();

        Console.ReadKey();



    }

    static public T GetByType<T>()
    {
        return kernel.Get<T>();
    }

    public class LoadModule : NinjectModule
    {
        public override void Load()
        {    
            this.Bind<Test, T1>().To<T1>().InSingletonScope();
            this.Bind<Test>().To<T2>();

        }
    }

预期输出:

    T1
    T2


    T1
    abc
    abc

    T2
    abc
    T2

    abc
    T2