regardant la source (et la trace de la pile, je suis arrivé par reproing que vous omettez: P)
C'est parce qu'il est la liaison à une autre surcharge du ConstructorArgument
cteur que l'utilisation normale (où vous re passer un type de valeur ou un type de référence non nul).
La solution est de lancer le nul à l'objet: -
var ninja = kernel.Get<Ninja>(new ConstructorArgument("weapon", (object)null));
source de Ninject 2:
public class ConstructorArgument : Parameter
{
/// <summary>
/// Initializes a new instance of the <see cref="ConstructorArgument"/> class.
/// </summary>
/// <param name="name">The name of the argument to override.</param>
/// <param name="value">The value to inject into the property.</param>
public ConstructorArgument(string name, object value) : base(name, value, false) { }
/// <summary>
/// Initializes a new instance of the <see cref="ConstructorArgument"/> class.
/// </summary>
/// <param name="name">The name of the argument to override.</param>
/// <param name="valueCallback">The callback to invoke to get the value that should be injected.</param>
public ConstructorArgument(string name, Func<IContext, object> valueCallback) : base(name, valueCallback, false) { }
}
Repro:
public class ReproAndResolution
{
public interface IWeapon
{
}
public class Ninja
{
private readonly IWeapon _weapon;
public Ninja(IWeapon weapon)
{
_weapon = weapon;
}
}
[Fact]
public void TestMethod()
{
var kernel = new StandardKernel();
var ninja = kernel.Get<Ninja>(new ConstructorArgument("weapon", (object)null));
}
}
leçon? Vous seriez fou de ne pas télécharger la dernière source et regardez-le. Super commentaires, bonne base de code propre. Merci encore à Ian Davis pour cette astuce/aiguillon!
Je ne suis pas familier avec ninject, mais je pense que le problème est que IoC-conteneur utilise des informations de type pour trouver un constructeur approprié et il ne peut pas le trouver par la valeur nulle. Vous feriez mieux de chercher une réponse dans la documentation ou dans son code. Dans une bibliothèque que j'ai utilisé l'instance de l'objet Type correspondant doit être passé à la place de null. Il pourrait y avoir une solution similaire ici aussi. – SergGr
Merci monsieur :-) – stiank81