2017-01-03 3 views
1

나는 IoC와 DI를 독자적으로 배우기 위해 약간의 예를 썼습니다. 나는 1 개 개의 간단한 질문이 : 내 예에서 비 숙련 노동자의 인스턴스를 얼마나제어 및 의존성 주입의 반전 - 귀하의 조언이 필요합니다.

을/

방법은 다음과 같은 2 개 분사 후보?

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

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

내가 조금 해요 사이 Switch가 아래로 내려가 있습니다 순간에 혼란 비트 ...

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에의 상황에 맞는 바인딩을 사용하여 컴파일 시간에 알고있는 경우 :.

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

안녕하세요 Jason, 답변 해 주셔서 감사합니다. 나는 Kernal을 부를 수 있다는 것을 알아 냈다. GETAll (). 그래서 당신은 그것들을 등록하고 모든 Bindings의 IEnumerable을 얻을 수 있습니다. 팩토리 패턴도 해결책이 될 수 있습니다. – Developer