2013-06-11 19 views
5

私は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

+0

は、第三のアプローチと何が問題なのですか?オブジェクトは再利用できませんか? – Romoku

+0

私のコンストラクタには、現在のユーザのためにいくつかのことを準備するロジックがあります。これはもう動作しません。私はまた、維持する必要があるコードをたくさん書く必要があります(すべてのビューモデルのクリーンアップメソッド)。古いインスタンスを捨てるアプローチは私にとってははるかに単純です。 – Joel

+0

MVVM Lightメンテナーによれば、これが推奨されるアプローチです。 [SimpleIoc - 必要なたびに新しいインスタンスを提供できますか?](http://stackoverflow.com/a/9350917/580951)それがあなたのアーキテクチャに合っていないなら、別のIOCに切り替えるほうが良いでしょう。 – Romoku

答えて

4

public static void Cleanup() { 
    SimpleIoc.Default.Unregister<LoginViewModel>(CurrentKey); 
    ... 
    CurrentKey = System.Guid.NewGuid().ToString(); 
} 
:現在のキーを(各アプリリセット段階に呼び出し)リセット最後にキーと

GetInstance(...)を呼び出すときにだけ静的CurrentKeyに渡します。

SimpleIoc.Default.GetInstance<LoginViewModel>(ViewModelLocator.CurrentKey); 
+0

私のために働いたが、私はまだIOCコンテナを変更することを好む。それにもかかわらず、これは有効な解決策であり、したがって正解です。あなたはより精巧なものにIoCコンテナを変更することを選択した場合、あなたのインスタンスだけでは何も持っていないされた後GCのゴミがVMのインスタンスを収集できるようになる 'ExternallyControlledLifetimeManager'を与えることができる場所 – Joel

+0

@Joelはよく、あなたはユニティを取ることができますあなたのログアウト後にそれへの強い参照。あなたは、あなたのオブジェクトのライフタイムを管理するために、さらに複数のマネージャーを持っています。しかし、これについては「SimpleIoC」には「間違っている」ことは全くありません – Viv

+0

私は今Unityを使用しています。これは正しいかどうかということではなく、単に「SimpeIoC」が私の必要性のすべてに合っていないということでした。 – Joel

関連する問題