5

依存性注入のためにNinjectからTinyIoCに変更したばかりで、コンストラクター注入に問題があります。

私はそれをこのスニペットまで単純化することができました:

public interface IBar { } 

public class Foo
{
    public Foo(IBar bar) { }
}

public class Bar : IBar
{
    public Bar(string value) { }
}

class Program
{
    static void Main(string[] args)
    {
        var container = TinyIoCContainer.Current;

        string value = "test";
        container.Register<IBar, Bar>().UsingConstructor(() => new Bar(value));

        var foo = container.Resolve<Foo>();
        Console.WriteLine(foo.GetType());
    }
}

これにより、TinyIoCResolutionExceptionが次のようにスローされます。

"Unable to resolve type: TinyIoCTestApp.Foo"

その例外の中には、一連の内部例外があります。

"Unable to resolve type: TinyIoCTestApp.Bar"
"Unable to resolve type: System.String"
"Unable to resolve type: System.Char[]"
"Value cannot be null.\r\nParameter name: key"

コンストラクターインジェクションの使用方法に何か問題がありますか?私は私が呼ぶことができることに気づきます

container.Register<IBar, Bar>(new Bar(value));

それは確かに機能しますが、結果はBarのグローバルインスタンスであり、私が求めているものではありません。

何か案は?

4

1 に答える 1

10

私は TinyIOC に詳しくありませんが、あなたの質問に答えることができると思います。

は、TinyIOC が自動コンストラクター注入を行うために使用するUsingConstructorコンストラクター ( ) を指すラムダを登録します。ctor(string)TinyIOC はコンストラクターの引数を分析し、型の引数を見つけて、System.Stringその型を解決しようとします。明示的に登録していないためSystem.String(これはすべきではありません)、解決IBar(したがってFoo)は失敗します。

あなたが行った誤った仮定は、TinyIOC が() => new Bar(value))ラムダを実行するというものですが、そうではありません。メソッドを見ると、 の代わりにUsingConstructorが必要であることがわかります。Expression<Func<T>>Func<T>

必要なのは、作成を行うファクトリ デリゲートを登録することです。TinyIOC にはこのためのメソッドが含まれていると思います。次のようになります。

container.Register<IBar>(() => new Bar(value));
于 2012-02-09T08:48:37.473 に答える