我是Ninject的新手。有人能帮我实现我想要的吗?我给你们举个例子。请告诉我如何使用NInject实现松耦合。
假设我有一个如下所示的接口:
public interface IVehicle
{
PrintSpecification();
}
现在我有三个类实现了上面的接口。如下图所示。
public class Car implements IVehicle
{
public void PrintSpecification()
{ Console.WriteLine("Specification for Car");}
}
public class Bus implements IVehicle
{
public void PrintSpecification()
{ Console.WriteLine("Specification for Bus");}
}
public class Truck implements IVehicle
{
public void PrintSpecification()
{ Console.WriteLine("Specification for Truck");}
}
现在在我的主程序中,我将有这样的东西。这里我使用new算子创建了Car
, Bus
和Truck
的三个具体实现。我必须显示所有三辆车的规格。现在我想知道如何编写Ninject代码,使其不依赖于具体类。
Public static void main()
{
IVehicle v1=new Car();
IVehicle v2=new Bus();
IVehicle v3=new Truck();
v1.PrintSpecification();
v2.PrintSpecification();
v3.PrintSpecification();
}
您可以通过这种方式绑定所有规范:
public class AutoModule : NinjectModule
{
public override void Load()
{
Bind<IVehicle>().To<Car>();
Bind<IVehicle>().To<Bus>();
Bind<IVehicle>().To<Truck>();
}
}
和在你的应用程序中:
IKernel kernel = new StandardKernel(new AutoModule());
kernel.Bind<Inspector>().ToSelf();
class Inspector
{
IVehicle[] vehicles;
public Inspector(IVehicle[] vehicles)
{
this.vehicles=vehicles;
}
public void PrintSpecifications()
{
foreach(var v in vehicles )
{
v.PrintSpecification();
}
}
}
//automatic injection in constructor
kernel.Get<Inspector>().PrintSpecifications();
如果你想有条件地绑定一个实现,你可以使用
- <
- 命名绑定/gh><
- 条件绑定/gh><
- 上下文绑定/gh>
NInject wiki中有一个很好的文档。
如果你需要在你的模块中映射多个类型,考虑使用一些命名约定并创建一些自动绑定策略。
您还应该做一些努力来与IoC容器解耦,看看复合根模式是如何工作的。
为IVehicle
实现创建带有命名绑定的模块:
public class AutoModule : NinjectModule
{
public override void Load()
{
Bind<IVehicle>().To<Car>().Named("Small");
Bind<IVehicle>().To<Bus>().Named("Big");
Bind<IVehicle>().To<Truck>().Named("Huge");
}
}
按名称获取您的车辆:
IKernel kernel = new StandardKernel(new AutoModule());
IVehicle v1 = kernel.Get<IVehicle>("Small");
IVehicle v2 = kernel.Get<IVehicle>("Huge");
IVehicle v3 = kernel.Get<IVehicle>("Big");
v1.PrintSpecification();
v2.PrintSpecification();
v3.PrintSpecification();