an der Quelle der Suche (und der Stack-Trace I von reproing haben, die Sie nicht angegeben: P)
Dies liegt daran, es auf eine andere Überlastung des ConstructorArgument
Ctor als die normale Nutzung (dh wo es ist verbindlich Übergeben eines Werttyps oder eines Nicht-Null-Referenztyps).
Die Abhilfe ist die Null zu gieße Objekt -
var ninja = kernel.Get<Ninja>(new ConstructorArgument("weapon", (object)null));
Ninject 2 Quelle:
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));
}
}
Lektion? Du wärst verrückt, die neueste Quelle nicht herunterzuladen und anzuschauen. Tolle Kommentare, schöne, saubere Codebasis. Nochmals vielen Dank an @Ian Davis für diesen Tipp!
Ich bin nicht vertraut mit Ninject, aber ich denke, das Problem ist, dass IoC-Container Typ Informationen verwendet, um einen geeigneten Konstruktor zu finden, und es kann nicht durch Null-Wert herausfinden. Sie sollten besser in der Dokumentation oder im Code nach Antworten suchen. In einer Bibliothek, die ich Instanz des entsprechenden Type-Objekts verwendet hat, muss statt Null übergeben werden. Es könnte auch eine ähnliche Lösung geben. – SergGr
Vielen Dank sir :-) – stiank81