2011-12-16 25 views
0

コンポーネントを登録するときにOnReleaseメソッドがあり、ILifetimeScopeにもCurrentScopeEndingイベントがありますが、問題のライフタイムスコープを使用して何かを解決できなくなった後、これらの拡張ポイントの両方で不思議なコードが実行されます。試してみるとObjectDisposedExceptionが発生します。しかし、私はする必要があります!私に何ができる?autofacでライフタイムスコープが終了する前にロジックを実行するにはどうすればよいですか?

答えて

0

現在の有効期間のスコープが破棄されているときに、スコープから何かを解決するのは少し奇妙です。なぜあなたはそれが必要なのですか?ルートスコープから「必要なもの」を解決しようとします。

+0

これはまさに私がしていることです。データベースの変更を保存する際に「必要なもの」が必要になるだけです。現在のリクエストが終了したときにのみ発生します。つまり、現在のライフタイムスコープが破棄されています。 –

+0

明示的な 'Unit Of Work'(==リクエストスコープ)を持っていることをお勧めしますが、もしあなたが主張しているのであれば... TheThingをコンテキストから削除するのではなく、ルートコンテキストから解決してもよろしいですか? TheThingを事前に解決してからOnReleaseで使用してみてください... –

0

私はこのスレッドが古くなっていることは知っていますが、それはまだ開いていますので、私はそれを無料ゲームと考えています。プラス私はちょうど私自身でこれを解決したので、私はそれが私のGoogleの結果で高かったので、私はそれに答えると思った。他の人たちを助けるかもしれない。

は、ここで私はILifetimeScopeインスタンスの寿命をログに記録するやったことだ:

 

class LifetimeLogger : IStartable 
{ 
    readonly ILifetimeScope _lifetimeScope; 

    public LifetimeLogger(ILifetimeScope lifetimeScope) 
    { 
     _lifetimeScope = lifetimeScope; 
     //_lifetimeScope = scope; 
    } 

    public void Start() 
    { 
     initLifetimeScope(_lifetimeScope); 
    } 

    static void initLifetimeScope(ILifetimeScope lifetimeScope) 
    { 
     //lifetimeScope. 
     lifetimeScope.ChildLifetimeScopeBeginning += (sender, args) => 
     { 
      log("Begging lifetime scope (tag {0})", args.LifetimeScope.Tag); 
      initLifetimeScope(args.LifetimeScope); 
     }; 

     lifetimeScope.CurrentScopeEnding += (sender, args) => log("Ending lifetime scope ({0})", args.LifetimeScope.Tag); 
    } 
} 

次のようなものを使用することができますし、あなたはすべての子供の寿命の範囲の最初と最後にロジックを実行するために取得します。