1

私はNinjectが初めてです。誰かが私が望むものを達成するのを手伝ってくれますか? 私の例を挙げましょう。NInject を使用して疎結合を取得する方法を教えてください。

以下に示すインターフェースがあるとしましょう。

public interface IVehicle
{
 PrintSpecification();
}

これで、上記のインターフェイスを実装する 3 つのクラスができました。それらは示されているようになる可能性があります。

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ここでは、 new 演算子を使用して、Busとの 3 つの具体的な実装を作成しましTruckた。3台の車両すべての仕様を表示する必要があります。具体的なクラスに依存しないように、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();

条件付きで1つの実装をバインドする方法が必要な場合は、使用できます

  • 名前付きバインディング
  • 条件付きバインディング
  • コンテキスト バインディング

NInject wiki に優れたドキュメントがあります

モジュールで複数のタイをマップする必要がある場合は、何らかの命名規則を使用することを検討し、いくつかの自動バインド戦略を作成してください。

また、IoC コンテナーから分離することにも努力を払う必要があります。コンポジション ルート パターンがどのように機能するかを確認してください。

于 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 に答える