2017-07-06 5 views
1

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?

Antwort

0

Eigentlich ist das Problem nicht die Bindung für den C Dienst, aber die Bindung für B.

Der standardmäßige Factory-Instanzanbieter erstellt benannte Bindungen für Methoden, die mit Get beginnen (siehe here).

Entweder Ihr Factory-Methode auf andere etwas ändern als Get oder dieses Add eine leere Bindung für B Namen zu erstellen:

kernel.Bind<B>().ToSelf().Named(""); 
+0

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

+1

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. :) –

Verwandte Themen