必要に応じて、クラス全体を削除するよりも、クラスのインスタンスを登録解除することができます。
からのスニペットSimpleIoc.cs
:
//
// Summary:
// Removes the instance corresponding to the given key from the cache. The class
// itself remains registered and can be used to create other instances.
//
// Parameters:
// key:
// The key corresponding to the instance that must be removed.
//
// Type parameters:
// TClass:
// The type of the instance to be removed.
public void Unregister<TClass>(string key) where TClass : class;
解決するたびにクラスの新しいインスタンスを取得することに注意してください。クラスにSimpleIoC
一意のキーを指定する必要がありますGetInstance()
そのためViewModelLocator.cs
、使用済みへの参照を保持currentKey
し、次の試行で登録解除します。次のようになります。
private string _currentScanVMKey;
public ScanViewModel Scan
{
get {
if (!string.IsNullOrEmpty(_currentScanVMKey))
SimpleIoc.Default.Unregister(_currentScanVMKey);
_currentScanVMKey = Guid.NewGuid().ToString();
return ServiceLocator.Current.GetInstance<ScanViewModel>(_currentScanVMKey);
}
}
このように、VMLocator が新しい VM に対して照会されるたびにScan
、現在の VM を登録解除した後に返されます。このアプローチは、"Laurent Bugnion" Hereによって提案されたガイドラインに準拠します。彼は自分のライブラリをよく知っていると思います。そうすれば、間違いはありません。
MVVM Light の作成者の状態は、開発者SimpleIoC
に IOC の原則を理解してもらい、自分で調べてもらうことを目的としていたことを覚えています。単純なプロジェクトには最適です。VM インジェクションをより細かく制御したい場合は、Unityなどを検討することをお勧めします。Unity では、現在の状況を簡単に解決できるため、
// _container is a UnityContainer
_container.RegisterType<ScanViewModel>(); // Defaults to new instance each time when resolved
_container.RegisterInstance<ScanViewModel>(); // Defaults to a singleton approach
また、さらに優れた制御を提供する LifeTimeManagers と並べ替えも取得します。はい、Unity は に比べてオーバーヘッドがかかりますが、SimpleIoC
自分でコードを書かなければならないよりも、必要なときにテクノロジが提供できるものです。