私は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を呼び出す特別なスレッドを持っていても、右の臭いはありません。