Параметр конструктора Ninject 2.0 - как установить, когда присутствует конструктор по умолчанию?
Я новичок в контейнерах IOC и изучаю Ninject. Я использую версию 2.0, только что загруженную из Github.
Я пытаюсь установить строковый параметр в конструкторе, когда присутствует конструктор по умолчанию. Я прошел через источник Ninject, но я недостаточно знаком с шаблонами, которые используются для того, чтобы легко определить, что мне не хватает.
Вот мое тестовое консольное приложение:
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
kernel.Bind<ITestClass>().To<TestClass>()
.WithConstructorArgument("message", "Hello World!");
var testClass = kernel.Get<ITestClass>();
// Does not work either:
//var testClass = kernel.Get<ITestClass>(new ConstructorArgument("message", "Hello World!"));
testClass.DisplayMessage();
Console.ReadLine();
}
}
public interface ITestClass
{
void DisplayMessage();
}
public class TestClass : ITestClass
{
public TestClass()
{
this.message = "Wrong message :(";
}
private string message;
public TestClass(string message)
{
this.message = message;
}
public void DisplayMessage()
{
Console.WriteLine(this.message);
}
Код выводит "Неверное сообщение:(" на консоль. Если я удалю конструктор по умолчанию в TestClass, я получаю "Hello World!". Что мне здесь не хватает?
Чтобы уточнить: я хочу, чтобы класс печатал "Hello World!" на консоль с представленным конструктором по умолчанию.
Ответы
Ответ 1
Строка не является самопереключаемой, поэтому она не считается зависимостью. Когда выполняется scorer.ctor, он будет оценивать значение по умолчанию .ctor и string.ctor то же самое, поскольку зависимость не может быть разрешена. Вы можете исправить это, присвоив строку .ctor
[Inject]
public TestClass(string message){...}
и ваш код будет работать нормально.