0

カーネルがその中にあるオブジェクトをどのように処分したかを理解しようとしています。たとえば、次のコードは 2 つのスコープを作成し、スコープが同じ場合は同じオブジェクトを解決し、スコープが異なる場合は別のオブジェクトを解決することをアサートします。

[Test]
public void DisposingScope()
{

    var kernel = new StandardKernel();

    ScopeObject scopeObject = null;

    kernel.Bind<IBall>().To<RedBall>().InScope(context => scopeObject);

    var scope1 = new ScopeObject();
    var scope2 = new ScopeObject();

    scopeObject = scope1;

    var ball1A = kernel.Get<IBall>();
    var ball1B = kernel.Get<IBall>();

    Assert.That(ball1A, Is.SameAs(ball1B));  // <== Balls from the same scope

    scopeObject = scope2;
    var ball2 = kernel.Get<IBall>();
    Assert.That(ball2, Is.Not.SameAs(ball1A));  // <== Balls from different scopes
}

スコープが 2 つあるRedBallため、コンテナーには 2 つのインスタンスが保持されます。

  • これらは\いつどのように削除されますか?
  • コンテナ内のボールが廃棄されたことを証明するためにテストを拡張するにはどうすればよいですか?
4

1 に答える 1

2

Ninject はWeakReferenceスコープに a を保持します。ninject が (アクティブに - INotifyWhenDisposed で) スコープの終了について通知されていない場合、スコープがまだ有効かどうかを定期的にチェックします。死んでいる場合は、そのスコープに属するスコープ リソースを破棄します。

破棄が正しく機能することをテストするには、 をモックし、期待どおりに呼び出されたIDisposableことを確認します。ガベージ コレクションのテストは、JetBrains のdotMemory UnitDispose()を使用して実行できます。

詳細については、この質問に対する私の広範な回答を参照してください。質問には、dotMemory Unit の使用方法の例も示されています。

于 2016-06-30T05:51:48.217 に答える