私はMVVM Light frameworkを使用してC#WPFアプリケーションを作っています。私のアプリケーションでは、ViewModelLocator
クラスを使用して、実行時にビューモデルを検索します。 ViewModelLocator
は、MVVM Light frameworkにも付属するSimpleIoc
クラスを使用します。IOCコンテナ内のすべてのインスタンスをリセットする方法
は、ここに私のシナリオです:中 ユーザーのログは自分のアプリケーションを使用することができます。ログアウト時に、私は次のユーザーにきれいな環境を提供するために、すべてのviewmodelインスタンスを破棄/リセット/再作成したいと思います。
ViewModelLocator
クラスにCleanup()
メソッドを実装しようとしましたが、機能しません。 Not workingは、(2番目の)ユーザーが以前にログインしたユーザーからのデータを見ることを意味します。
最初の試み:
public static void Cleanup()
{
SimpleIoc.Default.Reset();
}
2回目の試行:
public static void Cleanup()
{
SimpleIoc.Default.Unregister<LoginViewModel>();
SimpleIoc.Default.Unregister<TaskViewModel>();
SimpleIoc.Default.Register<LoginViewModel>();
SimpleIoc.Default.Register<TaskViewModel>();
}
3回目(回避策を私はしたいが、それはありません何):
public static void Cleanup()
{
// I implemented the ICleanup interface in my viewmodels
// The cleanup method clears all my variables eg: myCollection.clear();
SimpleIoc.Default.GetInstance<LoginViewModel>().Cleanup();
SimpleIoc.Default.GetInstance<TaskViewModel>().Cleanup();
}
私はすべてリセットするにはどうすればよいです私のViewModelLocator
クラスのインスタンス?必要に応じて、より高度なIOCコンテナを使用したいと思います。私は
private static string _currentKey = System.Guid.NewGuid().ToString();
public static string CurrentKey {
get {
return _currentKey;
}
private set {
_currentKey = value;
}
}
のようなユニークなKey
何かのためのプライベート文字列のバックエンドとパブリック静的プロパティを追加し、現在でVMの登録を解除するために、クリーンアップの方法を持っていると思いますSimpleIoC
で
は、第三のアプローチと何が問題なのですか?オブジェクトは再利用できませんか? – Romoku
私のコンストラクタには、現在のユーザのためにいくつかのことを準備するロジックがあります。これはもう動作しません。私はまた、維持する必要があるコードをたくさん書く必要があります(すべてのビューモデルのクリーンアップメソッド)。古いインスタンスを捨てるアプローチは私にとってははるかに単純です。 – Joel
MVVM Lightメンテナーによれば、これが推奨されるアプローチです。 [SimpleIoc - 必要なたびに新しいインスタンスを提供できますか?](http://stackoverflow.com/a/9350917/580951)それがあなたのアーキテクチャに合っていないなら、別のIOCに切り替えるほうが良いでしょう。 – Romoku