Estoy tratando de encontrar la manera correcta de enlazar algo como esto con ninject.Dependencia cíclica con ninject
interface IMainService
{
void DoStuff();
}
interface IOtherService
{
void DoSomeMagic();
}
abstract class BaseClass
{
//many stuff here
}
class MainClass : BaseClass, IMainService
{
public MainClass(IOtherService s)
{
}
public void DoStuff()
{
throw new NotImplementedException();
}
//do many other things
}
class OtherClass : IOtherService
{
public OtherClass(IMainService s)
{
}
public void DoSomeMagic()
{
throw new NotImplementedException();
}
}
class BaseModule : NinjectModule
{
public override void Load()
{
Bind<MainClass>().To<MainClass>();
Bind<IMainService>().To<MainClass>();
Bind<IOtherService>().To<OtherClass>();
}
}
static class Program
{
static void Main()
{
var kernel = new StandardKernel(new BaseModule());
var main = kernel.Get<MainClass>();
}
}
Me da una excepción:
Error activating IOtherService using binding from IOtherService to OtherClass
A cyclical dependency was detected between the constructors of two services.
Activation path:
4) Injection of dependency IOtherService into parameter s of constructor of type MainClass
3) Injection of dependency IMainService into parameter s of constructor of type OtherClass
2) Injection of dependency IOtherService into parameter s of constructor of type MainClass
1) Request for MainClass
Suggestions:
1) Ensure that you have not declared a dependency for IOtherService on any implementations of the service.
2) Consider combining the services into a single one to remove the cycle.
3) Use property injection instead of constructor injection, and implement IInitializable if you need initialization logic to be run after property values have been injected.
No sé cómo escribir BaseModule. Necesito solo una instancia de MainClass y una instancia de OtherClass (como singletons).
he intentado cosas por el estilo:
Bind<MainClass>().To<MainClass>().InSingletonScope();
Bind<IMainService>().To<MainClass>().InRequestScope();
Bind<IOtherService>().To<OtherClass>().InSingletonScope();
pero con el mismo error.
¿Y cómo escribir el enlace para usar solo una instancia para las interfaces MainClass y IMainService?
Gracias por responder.
Gracias por t su propina Encontré la solución perfecta con la inyección de propiedad. Pero es sin IOtherService OtherService {set; } en IMainServices, porque cuando decore la propiedad con [Inject], Ninject le agrega la instancia correcta. –
Esto no funciona. Con la última versión de Ninject, arrojará una 'StackOverflowException' si usa la inyección de propiedades para ambos, y arrojará la" dependencia cíclica detectada "si solo uno está usando inyección de propiedad (y la otra inyección de constructor). –
Ah, pero * does * funciona siempre que utilice un ámbito que no sea el alcance transitorio (el valor predeterminado). –