Глядя на источник (и трассировки стека я получил от reproing который вы пропущенной: P)
Это происходит потому, что это связывание с другой перегрузки ConstructorArgument
CTOR, чем нормального использования (то есть, где вы» повторная передача типа значения или непустого ссылочного типа).
Чтобы обойти эту проблему, чтобы бросить пустой указатель на объект: -
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));
}
}
Урок? Вы были бы сумасшедшими, чтобы не загружать последний источник и не смотреть на него. Отличные комментарии, хорошая чистая кодовая база. Еще раз спасибо @Ian Davis за подсказку/подталкивание!
Я не знаком с ninject, но я думаю, что проблема в том, что IoC-container использует информацию о типе, чтобы найти подходящий конструктор, и он не может найти его по нулевому значению. Лучше искать ответ в документации или в его коде. В одной библиотеке, которую я использовал экземпляр соответствующего объекта типа, нужно передать вместо null. Здесь может быть и такое же решение. – SergGr
Спасибо, сэр :-) – stiank81