15

我是 IOC 容器和学习 Ninject 的新手。我使用的是从 Github 新下载的 2.0 版。

当还存在默认构造函数时,我正在尝试在构造函数上设置字符串参数。我一直在逐步浏览 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!” 到带有默认构造函数的控制台。

4

1 回答 1

8

string 不是自绑定的,因此不计为依赖项。当 .ctor 记分器运行时,它将对默认的 .ctor 和字符串 .ctor 进行相同的评分,因为无法解决依赖关系。您可以通过归因您的字符串 .ctor 来解决此问题

[Inject] 
public TestClass(string message){...}

你的代码会正常工作。

于 2009-09-30T23:26:42.187 回答