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

文字列は自己バインドできないため、依存関係としてカウントされません。.ctorスコアラーを実行すると、依存関係を解決できないため、デフォルトの.ctorと文字列.ctorのスコアが同じになります。文字列.ctorを帰属させることで、これを修正できます。

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

コードは正常に機能します。

于 2009-09-30T23:26:42.187 に答える