2017-01-03 4 views
1

私はIoCとDIを自分で学習するための少しの例を書いています。 私は1つの簡単な質問があります:あなたは私の例では未熟練労働者をインスタンス化する方法を制御と依存性注入の反転 - あなたのアドバイスが必要です

を/

どのように私は、次の2つの注入候補?:

kernal.Bind<IRepair>().To<Employee>(); 

kernal.Bind<IRepair>().To<UnskilledWorker>() 

私は少しだ間swichすることができます現時点では少し混乱...

class Program 
    { 
     static void Main(string[] args) 
     { 
      IWorkShop instance = GetWorkShop(); 
      instance.StartToRepair(); 

      Console.ReadLine(); 
     } 

     private static IWorkShop GetWorkShop() 
     { 
      Ninject.IKernel kernal = new StandardKernel(); 
      kernal.Bind<IWorkShop>().To<WorkShop>(); 
      kernal.Bind<IRepair>().To<Employee>(); 


      var instance = kernal.Get<IWorkShop>(); 
      return instance; 
     } 
    } 

    public class WorkShop : IWorkShop 
    { 
     private IRepair _repair; 

     public WorkShop(IRepair repair) 
     { 
      _repair = repair; 
     } 

     public void StartToRepair() 
     { 
      _repair.RepairItNow(); 
     } 
    } 


    interface IWorkShop 
    { 
     void StartToRepair(); 
    } 


    public class Employee : IRepair 
    { 
     public void RepairItNow() 
     { 
      Console.WriteLine("Employee starts working."); 
     } 
    } 

    public class UnskilledWorker : IRepair 
    { 
     public void RepairItNow() 
     { 
      Console.WriteLine("Unskilled worker starts working."); 

     } 
    } 


    public interface IRepair 
    { 
     void RepairItNow(); 
    } 
} 

答えて

2

あなたがコンパイル時にわかっている場合、あなたはNinjectのコンテキストバインディングを使用することができます:を10。

IKernel kernal = new StandardKernel(); 
kernal.Bind<IWorkShop>().To<WorkShop>(); 
kernal.Bind<IRepair>().To<Employee>(); 
kernal.Bind<IRepair>().To<UnskilledWorker>().WhenInjectedInto(typeof(IWorkShop)); 

var instance = kernal.Get<IWorkShop>(); 
return instance; 

インスタンス化する依存関係を実行時に決定する必要がある場合は、ファクトリパターンを使用する必要があります。

+0

こんにちはジェイソン、あなたの答えをありがとう。私は、kernalを呼び出すことが可能であることを理解しました.GetAll ()。したがって、それらを登録してすべてのバインディングのIEnumerableを取得できます。ファクトリパターンもソリューションになる可能性があります。 – Developer