Ich versuche herauszufinden, wie man so etwas mit ninject binden.Zyklische Abhängigkeit mit 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>();
}
}
Es gibt mir Ausnahme:
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.
Ich weiß nicht, wie Basismodul zu schreiben. Ich brauche nur eine Instanz von MainClass und eine Instanz von OtherClass (wie Singletons).
Ich habe versucht, die Dinge so:
Bind<MainClass>().To<MainClass>().InSingletonScope();
Bind<IMainService>().To<MainClass>().InRequestScope();
Bind<IOtherService>().To<OtherClass>().InSingletonScope();
Aber mit dem gleichen Fehler.
Und wie schreibt Bindung für die Verwendung nur einer Instanz für MainClass und IMainService-Schnittstellen?
Danke für die Antworten.
Vielen Dank für t sein Tipp. Ich fand die perfekte Lösung mit der Eigenschaft Injektion. Aber es ist ohne IOtherService OtherService {set; } auf IMainServices, wenn ich mit [Inject] eine Eigenschaft dekoriere, fügt Ninject selbst die richtige Instanz hinzu. –
Dies funktioniert nicht. Mit der neuesten Version von Ninject wird eine 'StackOverflowException' ausgelöst, wenn Sie die Eigenschaft injection für beide verwenden und die" zyklische Abhängigkeit wurde erkannt "ausgelöst, wenn nur eine die Eigenschaft injection (und die andere Konstruktorinjektion) verwendet. –
Ah, aber es funktioniert, solange Sie einen anderen Bereich als den vorübergehenden Bereich verwenden (Standard). –