簡體   English   中英

Ninject:從相同抽象類繼承的GetAll實例

[英]Ninject: GetAll instances that inherit from the same 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。

當前,您僅使用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>());

除了創建兩個綁定之外,第二個帶有“重定向”到第一個的綁定,您還可以執行以下操作:

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

這更清楚地表達了意圖。

因此,如果您需要從抽象類繼承單例並通過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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM