如何使用Ninject实现松耦合



我是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, BusTruck的三个具体实现。我必须显示所有三辆车的规格。现在我想知道如何编写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();

最新更新