ソース(および、省略した再現によって取得したスタックトレース:P)を確認します。
これはConstructorArgument
、通常の使用法(つまり、値型またはnull以外の参照型を渡す場合)とは異なるctorのオーバーロードにバインドしているためです。
回避策は、nullをオブジェクトにキャストすることです:-
var ninja = kernel.Get<Ninja>( new ConstructorArgument( "weapon", (object)null ) );
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) { }
}
再現:
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 ) );
}
}
レッスン?最新のソースをダウンロードして見ないように気が狂うでしょう。素晴らしいコメント、すてきなクリーンなコードベース。そのヒント/提案をしてくれた@IanDavisにもう一度感謝します!