NInject 将通用接口绑定到每个类型参数的实现
NInject binding generic interface to its implementations for each type parameter
我将通用接口绑定到它的实现:
class Program
{
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
kernel.Bind<ICreator<bool>>().To<BoolCreator>().InSingletonScope();
kernel.Bind<ICreator<int>>().To<IntCreator>().InSingletonScope();
kernel.Bind<ICreator<string>>().To<StringCreator>().InSingletonScope();
Console.WriteLine(kernel.Get<ICreator<bool>>().Create());
Console.WriteLine(kernel.Get<ICreator<int>>().Create());
Console.WriteLine(kernel.Get<ICreator<string>>().Create());
}
}
interface ICreator<T>
{
T Create();
}
class BoolCreator : ICreator<bool>
{
public bool Create() => true;
}
class IntCreator : ICreator<int>
{
public int Create() => 123;
}
class StringCreator : ICreator<string>
{
public string Create() => "abc";
}
添加新的class时,也需要手动绑定。有没有办法自动绑定它?我试过这个:
kernel.Bind(scanner => scanner
.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom(typeof(ICreator<>))
.BindSingleInterface()
.Configure(b => b.InSingletonScope()));
但这是行不通的。
谢谢。
基于约定的绑定仅适用于 public 的类型。您的类型默认是内部类型,因为它们没有访问修饰符。使它们 public 并且您的绑定将起作用。
我将通用接口绑定到它的实现:
class Program
{
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
kernel.Bind<ICreator<bool>>().To<BoolCreator>().InSingletonScope();
kernel.Bind<ICreator<int>>().To<IntCreator>().InSingletonScope();
kernel.Bind<ICreator<string>>().To<StringCreator>().InSingletonScope();
Console.WriteLine(kernel.Get<ICreator<bool>>().Create());
Console.WriteLine(kernel.Get<ICreator<int>>().Create());
Console.WriteLine(kernel.Get<ICreator<string>>().Create());
}
}
interface ICreator<T>
{
T Create();
}
class BoolCreator : ICreator<bool>
{
public bool Create() => true;
}
class IntCreator : ICreator<int>
{
public int Create() => 123;
}
class StringCreator : ICreator<string>
{
public string Create() => "abc";
}
添加新的class时,也需要手动绑定。有没有办法自动绑定它?我试过这个:
kernel.Bind(scanner => scanner
.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom(typeof(ICreator<>))
.BindSingleInterface()
.Configure(b => b.InSingletonScope()));
但这是行不通的。
谢谢。
基于约定的绑定仅适用于 public 的类型。您的类型默认是内部类型,因为它们没有访问修饰符。使它们 public 并且您的绑定将起作用。