2

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

誰かが私が間違っていることを見ることができますか?

4

1 に答える 1

2

バインディングが正しくないため、失敗します。

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

FutureRealisticDataManagerから継承しませんMainWindow。代わりに、次のように書く必要があります。

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

FutureRealisicDateManagerこれは、要求されたときにいつでも戻るように Ninject に指示IRealisicDateManagerします。

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

于 2009-05-12T11:57:37.177 に答える