2009-05-12 3 views
2

私はIoC/DIフレームワークが初めてです。私が最初に試しているのは、Ninjectフレームワークです。それは簡単ですが、私は私のコンソールアプリケーションを実行することができません。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>(); 

FutureRealisticDataManagerMainWindowから継承されません。 代わりに次のように記述する必要があります

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

これはIRealisicDateManagerが要求されるたびにFutureRealisicDateManagerを返すようにNinjectを伝えます。

このようにしてk.Get<MainWindow>()を呼び出すと、カーネルはFutureRealisticDateManagerをコンストラクタに注入します。

+0

ああ、それは完璧な意味があります。ありがとうMokosh! – willem

関連する問題