2011-01-26 13 views
0

私はCaliburn.MicroでNinjectを使用してMVVM WCF Silverlightアプリケーションを作成しています。私が持っている問題は、私のビューモデルのライフサイクルです。ViewModel Dispose not called

ビューモデルとwcfクライアントをバインドするための簡単なninjectモジュールを作成しました。私IIdCardViewModelで

public class IDCardModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IIdCardManagerClient>().To<IdCardManagerClient>(); 
      Bind<IDCard.SL.ViewModel.IIdCardViewModel>().To<IDCard.SL.ViewModel.IdCardViewModel>(); 
     } 
    } 

私は、WCFのイベントといくつかのローカル管理されていない参照を登録し、登録解除したいので、それは、IDisposableを継承必要としていました。

ただし、Disposeが呼び出されることはありません。

は、私はこのような処分を呼び出すための不活性化を追加することに見えた:

Bind<IDCardExclude.SL.ViewModel.IIdCardExclusionViewModel>().To<IDCardExclude.SL.ViewModel.IdCardExclusionViewModel>().OnDeactivation(
       m => m.Dispose()); 

しかし、それは、オブジェクトを取得し、私のIDCardModuleに二つのこと、アンロード・オーバーライドを追加するために私を強制し、それにリリース:

var releaseMe = this.Kernel.Get<IIdCardViewModel>(); 
this.Kernel.Components.Get<Ninject.Activation.Caching.ICache>().Release(releaseMe); 

とLoadのMy Bindメソッドへの.InThreadScope()または.InSingletonScope()のいずれかです。

特定のオブジェクトに対して非アクティブ化を強制する簡単な方法はありますか?あるいは、別のIOCフレームワークを調べるべきですか?

私はIStartableを調べましたが、同様の問題がありました。 また、私は彼がアクティベーションブロックを持っていて、usingステートメント内のすべてをラップしているところで、詳細なNate's articleを読んでいます。私の問題は、私のビューモデルが長期間実行されている可能性があり、彼のソリューションがここではうまくいかないと思います。また、スリープしてGC.Collectを呼び出す特別なスレッドを持っていても、右の臭いはありません。

答えて

1

InTransientScopedオブジェクトのライフサイクルはNinjectによって管理されません。つまり、オブジェクトは破棄されず、非アクティブ化されません。ビューモデルが別のオブジェクトに挿入されている場合は、名前付きスコープ拡張からInParentScopeを使用できます。 Ninjectの追加のスコープについての私のblogpostを参照してください:http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

0

ルーカスB、

私はこれがあなたつもり助けですが、私はあまりにも巨大なメモリの使用にいくつかのケースでは有数の私のオブジェクトで廃棄問題があったかどうかわからないです。私はそれがイベント購読の問題であることを知りました。私がイベントに加入するたびに、私はイベントの完了後に決して退会しませんでした。私が理解する限り、オブジェクトはまだイベントに加入していれば破壊されません。そうしなければならない( - =)。

あなたの投稿に完全に関連していない場合でも、このヘルプをご希望ください。