Guardando alla fonte (e la traccia dello stack ho ottenuto da reproing cui è omesso: P)
Questo è perché è vincolante per un diverso sovraccarico del ConstructorArgument
ctor che l'uso normale (cioè, in cui si' re passando un tipo di valore o un tipo di riferimento non nullo).
La soluzione è quella di lanciare il nulla per oggetto: -
var ninja = kernel.Get<Ninja>(new ConstructorArgument("weapon", (object)null));
Ninject 2 fonte:
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));
}
}
lezione? Saresti pazzo a non scaricare l'ultima fonte e a guardarla. Grandi commenti, bella base di codice pulita. Grazie ancora a @Ian Davis per questo suggerimento!
fonte
2010-04-19 12:59:16
Non ho familiarità con ninject, ma penso che il problema sia che il contenitore IoC utilizza le informazioni sul tipo per trovare un costruttore adatto e non può trovarlo per valore nullo. Faresti meglio a cercare la risposta nella documentazione o nel suo codice. In una libreria che ho usato l'istanza dell'oggetto Type corrispondente deve essere passato invece di null. Potrebbe esserci qualche soluzione simile anche qui. – SergGr
Grazie signore :-) – stiank81