2

NInject (v1.0) 用の OnePerSessionBehavior を作成したいのですが、ほとんど動作しています。残っている唯一の問題は、新しいセッションがコンテナーから何かを要求するたびに .WithArguments() を使用して新しい引数を渡す方法です。現在、コンテナへの参照をアプリケーション変数として保持しているため、モジュールは一度しかロードされないため、もちろんバインディングは一度しか発生しません。

たとえば、次の例では、新しいセッションごとに「Something」の個々のインスタンスが返されますが、すべてのセッションに渡されるコンストラクター引数は同じ DateTime です。

Bind<ISomething>()
    .To<Something>()
    .Using<OnePerSessionBehavior>()
    .WithArgument("currentDateTime", DateTime.Now);
4

2 に答える 2

1

ラムダを引数として渡すことはできますか? たとえば、次のようなクラスがあるとします。

public class Something : ISomething
{
    public Something(Action<DateTime> initializer)
    {
        var now = initializer();
    }
}

次のようにバインドできます。

Bind<ISomething>()
    .To<Something>()
    .Using<OnePerSessionBehavior>()
    .WithArgument("initializer", () => { return DateTime.Now; });

正確な状況はわかりませんが、引数の注入を気にせずにオブジェクトを作成し、プロパティを設定するという別のアイデアがあります。

kernel.Bind<ISomething>().To<Something>().Using<OnePerSessionBehavior>();    
var mySomething = kernel.Get<Something>();
mySomething.DateCreated = DateTime.Now;

また:

mySomething.Initialize(DateTime.Now);

それらのアイデアのいずれかが機能しますか?

于 2011-03-01T06:34:53.933 に答える
0

バインディングの定義中に評価される値を渡しています。そのため、何度も同じ値を取得します。実際、私の頭の上からは、それに対する簡単な答えはありませんが、テスト目的で役立つかもしれないので、間違いなく考えます.

于 2009-07-14T19:50:35.573 に答える