¿Por qué mi solicitud de Ninject DI fallar con un ActivationException?
-
21-08-2019 - |
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?
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.