2017-01-03 1 views
1

J'ai écrit un petit exemple pour apprendre l'IoC et l'DI par moi-même. J'ai une question simple:Inversion de contrôle et injection de dépendances - J'ai besoin de vos conseils

Comment vous instancier l'ouvrier non qualifié dans mon exemple/

Comment puis-je swich entre les 2 candidats injectent suivants ?:

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

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

Je suis un peu peu confus au moment ...

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

Répondre

2

Si vous connaissez au moment de la compilation, vous pouvez utiliser les liaisons contextuelles de ninject:dix . Si vous avez besoin de décider à l'exécution de la dépendance à instancier, vous devrez utiliser un modèle d'usine.

+0

Bonjour Jason, merci pour votre réponse. J'ai compris, qu'il est possible d'appeler kernal.GetAll (). Vous pouvez donc les enregistrer et obtenir un IEnumerable de toutes les liaisons. Factory Pattern pourrait aussi être une solution, c'est vrai. – Developer