2013-01-11 65 views
1

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

現在在我的主程序中,我會有這樣的東西。在這裏,我用新的操作員創建了三個具體的實現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(); 
} 
+0

迴應是:它取決於你如何選擇不同的應用程序在你的應用程序之間... –

回答

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

這是接線具體方法的正確方法,或者你只是給了替代方案。此外,如果我有50種其他類型的接口需要接線,我應該使用相同的負載方法進行接線。 – user1592389

+0

@ user1592389是的,你應該綁定你的應用程序所需的所有類型。另外,如果您需要將一種類型綁定到不同的實現,則應該使用命名綁定。 –

+1

@lazyberezovsky命名綁定不是唯一的方法......它取決於你想要達到的目標。 –

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

如果你想一些辦法conditionately一個實現綁定,您可以使用

  • 命名綁定
  • 條件綁定
  • 語境綁定

There is a good documentation inthe NInject wiki

如果您需要在您的模塊中映射多個tyes,請考慮使用一些命名約定並創建一些自動綁定策略。

你也應該做一些努力來從IoC容器中分離出來,看看Composition Root Pattern的工作原理。

+0

謝謝你的回覆。儘管我有最後一個概念性問題。使用您的解決方案,我不是在Main方法中創建具體的Car,Bus和Truck,而是在模塊的Load()方法中創建它們。現在我的問題是如何讓Load()方法中的這些類使它鬆散耦合,因爲我仍然需要在某處指定具體的類名。 – user1592389

+0

我不使用這個時間唯一的是「新」運營商。這不會使AutoModule與具體的類緊密結合。 – user1592389

+0

@ user1592389模塊被允許被緊密耦合,因爲它包含了它想要暴露的類型。重要的是你的應用程序與模塊解耦。我建議你也與IoC分離。 –