Параметр конструктора 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){...}

и ваш код будет работать нормально.