1

我是 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();
}
4

2 回答 2

2

您可以通过这种方式绑定所有规范:

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();

如果您想要某种方式有条件地绑定一个实现,您可以使用

  • 命名绑定
  • 条件绑定
  • 上下文绑定

NInject wiki 中有一个很好的文档

如果您需要在模块中映射多个类型,请考虑使用一些命名约定并创建一些自动绑定策略。

您还应该在与 IoC 容器解耦方面做一些努力,看看Composition Root Pattern是如何工作的。

于 2013-01-11T11:50:08.677 回答
1

为实现创建具有命名绑定的模块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();
于 2013-01-11T11:29:25.567 回答