Ninject と Caliburn.Micro を使用して、MVVM WCF Silverlight アプリを作成しています。私が抱えている問題は、ビュー モデルのライフ サイクルにあります。
ビュー モデルと wcf クライアントをバインドする単純な ninject モジュールを作成しました。
public class IDCardModule : NinjectModule
{
public override void Load()
{
Bind<IIdCardManagerClient>().To<IdCardManagerClient>();
Bind<IDCard.SL.ViewModel.IIdCardViewModel>().To<IDCard.SL.ViewModel.IdCardViewModel>();
}
}
私の IIdCardViewModel では、wcf イベントといくつかのローカルの管理されていない参照を登録および登録解除したいので、IDisposable から継承する必要がありました。
ただし、Dispose が呼び出されることはありません。
次のように dispose を呼び出すために非アクティブ化を追加することを検討しました。
Bind<IDCardExclude.SL.ViewModel.IIdCardExclusionViewModel>().To<IDCardExclude.SL.ViewModel.IdCardExclusionViewModel>().OnDeactivation(
m => m.Dispose());
しかし、そのために 2 つのことを追加する必要がありました。それは、オブジェクトを取得して解放する IDCardModule の Unload オーバーライドです。
var releaseMe = this.Kernel.Get<IIdCardViewModel>();
this.Kernel.Components.Get<Ninject.Activation.Caching.ICache>().Release(releaseMe);
.InThreadScope() または .InSingletonScope() を Load の Bind メソッドに追加します。
特定のオブジェクトを強制的に非アクティブ化する簡単な方法はありますか? それとも、別の IOC フレームワークを調べる必要がありますか?
IStartable を調べたところ、同様の問題がありました。同様に、Nate の詳細な記事を読んで、アクティベーション ブロックがあり、すべてを using ステートメントでラップしています。私の問題は、ビューモデルが長時間実行される可能性があり、彼のソリューションがここで機能するとは思わないことです。同様に、スリープ状態で GC.Collect を呼び出す特別なスレッドを使用することも適切ではありません。