2009-09-03 16 views

Respuesta

65
[Fact] 
    public void CtorArgTestResolveAtGet() 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<IWarrior>().To<Samurai>(); 
     var warrior = kernel 
      .Get<IWarrior>(new ConstructorArgument("weapon", new Sword())); 
     Assert.IsType<Sword>(warrior.Weapon); 
    } 

    [Fact] 
    public void CtorArgTestResolveAtBind() 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<IWarrior>().To<Samurai>() 
      .WithConstructorArgument("weapon", new Sword()); 
     var warrior = kernel.Get<IWarrior>(); 
     Assert.IsType<Sword>(warrior.Weapon); 
    } 
+1

¿Puedo pasar parámetros a un objeto profundamente en el gráfico del objeto usando ResolveAtGet? – Zach

+0

Las llamadas al método Get solo pasan los parámetros al elemento de nivel superior que se está resolviendo. Aparte de eso, si quiere que los parámetros pasen a objetos más profundos en la cadena, tendría que hacer eso en el enlace. –

+0

@Zach (e Ian, pero él sabe esto) hay una sobrecarga en el WithConstructorArgument/ConstuctorArgumetn ctor subyacente que permite que los argumentos se marquen como heredados, lo que hace que se propaguen en Resoluciones hijo como creo que quieres. (En general, es el enfoque equivocado y causará un desastre, pero definitivamente está ahí) –

1

no estoy seguro de si Ninject soporta (Estoy actualmente lejos de mi ordenador de desarrollo), pero si todo lo demás falla (la Ninject documentación deja mucho que desear) se podía separar de inicialización del constructor para resolver su problema:

class MyType 
{ 
    public class MyType() {} 
    public class MyType(string param1,string param2){Init(param1,param);} 
    public void Init(string param1,param2){...} 
} 

entonces usted puede hacer esto:

MyType obj = kernel.Get<MyType>(); 
obj.Init("foo","bar"); 

No es perfecto, pero debería hacer el trabajo en la mayoría de los casos.

+0

Gracias por la respuesta, pero lamentablemente no puedo llamar al constructor de mi objeto sin este parámetro ... Ninject 1.x hace el trabajo bastante bien, me gustaría saber cómo ha cambiado esta función en el Versión 2.0. – andrecarlucci

Cuestiones relacionadas