Pregunta

Soy nuevo en marcos IOC / DI. La primera de ellas es que estoy tratando el marco de Ninject. Parece sencillo, pero no puedo hacer que mi aplicación de consola para ejecutar. Me aparece un ActivationException indicando:

"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()"

Mi código es muy simple. Aquí está mi archivo de programa ...

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


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

Aquí está mi ninject módulo de unión ...

public class DateBindingModule : StandardModule
{
    public override void Load()
    {
        Bind<MainWindow>().To<FutureRealisticDateManager>();
    }
}

Esta es la clase que recibe la clase inyectada ...

class MainWindow
{
    private IRealisticDateManager _d;

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

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

}

Y aquí se está inyectando la clase real ...

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

Y por último, la interfaz simple que la clase inyectada debe poner en práctica ...

public interface IRealisticDateManager
{
    DateTime GetRealisticDate();
}

¿Alguien puede ver lo que estoy haciendo mal?

¿Fue útil?

Solución

Se produce un error debido a que su unión no es correcto:

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

FutureRealisticDataManager no hereda de MainWindow. En su lugar debe escribir:

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

Esto le dice Ninject para volver FutureRealisicDateManager siempre que se solicite IRealisicDateManager.

De esta manera cuando se llama k.Get<MainWindow>() kernel inyectará FutureRealisticDateManager al constructor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top