Ninject: 继承自同一个抽象的GetAll实例class
Ninject: GetAll instances that inherit from the same abstract class
是否有可能 Ninject 获取从特定抽象 Class 继承的所有实例?例如,我有以下摘要 Class.
public abstract class MyAbstractClass { }
然后我有以下两个派生的 classes,它们都继承自相同的抽象 class。
public class MyDerivedClass1 : MyAbstractClass { }
public class MyDerivedClass2 : MyAbstractClass { }
现在我要将两个派生的 classes 与内核绑定,因为我希望它们处于单例范围内。
_kernel = new StandardKernel();
_kernel.Bind<MyDerivedClass1>().ToSelf().InSingletonScope();
_kernel.Bind<MyDerivedClass2>().ToSelf().InSingletonScope();
我知道内核可以 return 给我一个像下面这样的实例。
_kernel.Get<MyDerivedClass1>();
有没有办法获取所有继承自 MyAbstractClass 的 classes?我尝试了以下但没有成功。
IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>();
希望上面的 GetAll() 方法 return 包含两个实例的列表,一个是 MyDerivedClass1,第二个是 MyDerivedClass2。
目前您只绑定到实现类型,而不是基础 class 类型,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>());
不是创建两个绑定,第二个绑定到第一个 "redirect",您还可以做的是:
_kernel.Bind<MyAbstractClass, MyDerivedClass1>()
.To<MyDerivedClass1>().InSingletonScope();
_kernel.Bind<MyAbstractClass, MyDerivedClass2>()
.To<MyDerivedClass1>().InSingletonScope();
这样更能表达意图
因此,如果您需要从抽象 class 继承单例并通过 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
是否有可能 Ninject 获取从特定抽象 Class 继承的所有实例?例如,我有以下摘要 Class.
public abstract class MyAbstractClass { }
然后我有以下两个派生的 classes,它们都继承自相同的抽象 class。
public class MyDerivedClass1 : MyAbstractClass { }
public class MyDerivedClass2 : MyAbstractClass { }
现在我要将两个派生的 classes 与内核绑定,因为我希望它们处于单例范围内。
_kernel = new StandardKernel();
_kernel.Bind<MyDerivedClass1>().ToSelf().InSingletonScope();
_kernel.Bind<MyDerivedClass2>().ToSelf().InSingletonScope();
我知道内核可以 return 给我一个像下面这样的实例。
_kernel.Get<MyDerivedClass1>();
有没有办法获取所有继承自 MyAbstractClass 的 classes?我尝试了以下但没有成功。
IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>();
希望上面的 GetAll() 方法 return 包含两个实例的列表,一个是 MyDerivedClass1,第二个是 MyDerivedClass2。
目前您只绑定到实现类型,而不是基础 class 类型,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>());
不是创建两个绑定,第二个绑定到第一个 "redirect",您还可以做的是:
_kernel.Bind<MyAbstractClass, MyDerivedClass1>()
.To<MyDerivedClass1>().InSingletonScope();
_kernel.Bind<MyAbstractClass, MyDerivedClass2>()
.To<MyDerivedClass1>().InSingletonScope();
这样更能表达意图
因此,如果您需要从抽象 class 继承单例并通过 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