Versuchen, dies mit Ninjects Factory-Erweiterungen zu tun.Ninject-Factory-Schnittstelle lösen fehlende Konstruktorargumente vom Kernel
void Main()
{
IKernel kernel = new StandardKernel();
kernel.Bind<C>().ToMethod(ctx => new C());
kernel.Bind<IBFactory>().ToFactory();
var a = kernel.Get<A>();
a.Do();
}
public class A
{
IBFactory _fact;
public A(IBFactory factory)
{
_fact = factory;
}
public void Do()
{
_fact.Get("blah").Dump();
}
}
public class B
{
public B(C c, string s)
{
}
}
public interface IBFactory
{
B Get(string s);
}
public class C
{
}
Die Fabrik Schnittstelle schlägt fehl, da es keine C
hat in den B()
Konstruktor zu werfen. Es weiß jedoch, wie man einen C
aus dem Kernel macht, aber das Nachschlagen ist außerhalb des Bereichs der Standard-Factory-Methodenimplementierung.
Ich kann eine benutzerdefinierte IInstanceProvider
machen und diese in die Factory-Methode, z. B. ToFactory(() => new myCustomIIProvider())
, die die C
aus dem Kernel löst, aber es scheint wie viel Arbeit.
Gibt es einen einfacheren Weg, Ninject zu bekommen, um das fehlende ctor arg selbst aufzulösen?
HaH. Ich kann nicht glauben, dass ich stundenlang alle möglichen Kombinationen ausprobiert habe, was ich hätte vermeiden können, wenn ich in meinem Testcode nicht das Wort "Get" verwendet hätte. Sheesh :) Danke für die Hilfe. – OrdinaryOrange
Ja, ich war auch dort. Ich habe einen 'UnbenannteBindingInstanceProvider' ohne dieses Feature implementiert, da ich festgestellt habe, dass ich Get viel, aber named Bindings, nicht so sehr verwende. :) –