2009-05-12 2 views
2

IoC/DI 프레임 워크를 처음 사용했습니다. 첫 번째 시도는 Ninject 프레임 워크입니다. 그것은 간단하지만 콘솔 응용 프로그램을 실행할 수 없습니다. 계속 ActivationException이 표시됩니다.Ninject DI 응용 프로그램이 ActivationException으로 실패하는 이유는 무엇입니까?

"Error activating MainWindow: the StandardProvider returned an instance of type FutureRealisticDateManager, which is not compatible with the requested service. 
Using default binding from MainWindow to FutureRealisticDateManager (via StandardProvider) 
    declared by DateBindingModule.Load() 
Activation path: 
    1) active request for MainWindow 
    from Program.Main() 
    using default binding from MainWindow to FutureRealisticDateManager (via StandardProvider) 
    declared by DateBindingModule.Load()" 

내 코드는 매우 간단합니다. 여기 내 프로그램 파일 ... 여기

class Program 
{ 
    static void Main(string[] args) 
    { 
     IKernel k = new StandardKernel(new DateBindingModule()); 


     MainWindow mw = k.Get<MainWindow>(); 
     mw.Show(); 
     Console.ReadLine(); 
    } 
} 

내 Ninject에 결합되는 모듈 ... 여기
public class DateBindingModule : StandardModule 
{ 
    public override void Load() 
    { 
     Bind<MainWindow>().To<FutureRealisticDateManager>(); 
    } 
} 

가 주입 클래스를 수신 클래스는 ...이다

class MainWindow 
{ 
    private IRealisticDateManager _d; 

    [Inject] 
    public MainWindow(IRealisticDateManager dateManager) 
    { 
     _d = dateManager; 
    } 

    public void Show() 
    { 
     Console.WriteLine("*** MainWindow [" + _d.GetRealisticDate().ToString() + "] "); 
    } 

} 

그리고 여기에 실제 수업이 주입됩니다 ...

public class FutureRealisticDateManager : TestNinject.IRealisticDateManager 
{ 
    public DateTime GetRealisticDate() 
    { 
     return DateTime.Now.AddDays(15); 
    } 
} 

그리고 주입 된 클래스가 구현해야 마지막으로 간단한 인터페이스 ...

public interface IRealisticDateManager 
{ 
    DateTime GetRealisticDate(); 
} 

아무도 내가 뭘 잘못 볼 수 있을까요? 당신의 바인딩 때문에 실패

답변

2

바로되지 않습니다 :

Bind<MainWindow>().To<FutureRealisticDateManager>(); 

FutureRealisticDataManager

MainWindow에서 상속하지 않습니다. 대신 당신은 작성해야 :

Bind<IRealisticDateManager>().To<FutureRealisticDateManager>(); 

IRealisicDateManager가 요청 될 때마다 Ninject에이 FutureRealisicDateManager을 반환 알려줍니다.

k.Get<MainWindow>()을 호출하면 커널이 생성자에 FutureRealisticDateManager을 삽입합니다.

+0

아, 그건 완벽합니다. Mokosh에게 감사드립니다! – willem

관련 문제