2017-01-03 2 views
1

ich ein kleines Beispiel schrieb IoC und DI auf eigene Faust zu lernen. Ich habe eine einfache Frage:Inversion of Control und Dependency Injection - ich brauche Ihren Rat

Wie würden Sie die ungelernten Arbeiter in meinem Beispiel instanziiert/

Wie kann ich zwischen den folgenden 2 inject Kandidaten swich ?:

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

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

bin ich ein wenig Bit im Moment verwirrt ...

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

Antwort

2

Wenn Sie bei der Kompilierung dann wissen Sie Ninject der kontextuellen Bindungen verwenden können: https://github.com/ninject/ninject/wiki/Contextual-Binding.

Wenn Sie zur Laufzeit entscheiden müssen, welche Abhängigkeit Sie instanziieren müssen, müssen Sie ein Fabrikmuster verwenden.

+0

Hallo Jason, danke für deine Antwort. Ich habe herausgefunden, dass es möglich ist, kernal.GetAll () aufzurufen. So können Sie sie registrieren und erhalten eine IEnumerable aller Bindungen. Factory Pattern könnte auch eine Lösung sein, das stimmt. – Developer