0

私はFunqのスクリーンキャストを見ていますが、テストコードの次のラムダで何かを理解していません:

var container = new Container();
container.Register<IBar>(c => new Bar());

宣言:

public void Register<TService>(Func<Container, TService> factory) { ... }

ラムダでは、new Bar()はTServiceとして機能し、cは Register メソッドで使用される Funcのコンテナーとして機能します。

実行中、この c はいつ宣言されますか? ContainerのインスタンスがRegisterメソッドに渡されるタイミングがわからないので、最初に作成したコンテナでしょうか。

4

1 に答える 1

3

実行中、この c はいつ宣言されますか?

次の行を使用して、あなたはそうしました:

var container = new Container();

実際、Funq はそれ自身のインスタンスを提供されたデリゲートに渡します。これにより、たとえば次のことが可能になります。

container.Register<IBar>(c => 
{
    var bar = c.Resolve<Bar>();
    bar.SomeProperty = 5;
    return bar;
});

ただし、コンテナー自体をデリゲートに渡すと、この値は登録中に常に使用できるため、IMO はまったく役に立ちません。たとえば、次のように書くこともできます。

container.Register<IBar>(unused => 
{
    var bar = container.Resolve<Bar>();
    bar.SomeProperty = 5;
    return bar;
});

言い換えれば、メソッドが aではなくa をRegister受け入れた場合、はるかに簡単だったでしょう。前のスニペットは次のようになります。Func<T>Func<Container, T>

container.Register<IBar>(() => 
{
    var bar = container.Resolve<Bar>();
    bar.SomeProperty = 5;
    return bar;
});
于 2012-07-13T14:26:42.827 に答える