CSharp - C# 如何使用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");}


}



现在在我的主程序里,我会有。 这里我使用了新的操作符来创建 CarBusTruck的三个具体实现。 我必须显示所有三个车辆的规格。 现在我想知道如何编写我的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();



如果需要某种方法来绑定conditionately实现,可以使用

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

有一个很好的文档,可以在NInject中找到。

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

也应该做一些与IoC容器分解的工作,看看组合 root Pattern 如何工作。

原作者:
...