私が理解する限り、SimpleIocはGetInstanceメソッドを使用して、登録されているクラスのインスタンスを取得します。インスタンスが存在しない場合、インスタンスが作成されます。ただし、このインスタンスはキャッシュされ、常に取得されます。これはシングルトンパターンを模倣します。SimpleIoc - 必要なたびに新しいインスタンスを提供できますか?
私は、このViewModelが2回必要となる可能性が低い場合、ViewModelのインスタンスをメモリに保持する必要はないと考えています。そのため、必要なたびに新しいインスタンスを作成したいと思います。私たちはのviewmodelsのための工場を持っているしている場合は、我々はこのような性質を持っています:
public MyViewMOdel MyViewModel
{
get { return SimpleIoc.Default.GetInstance<MyViewModel>(); }
}
この1つは、私はすべてのケースではベストプラクティスではありませんだと思うシングルトンパターンを使用しています。この問題を回避するために、私はこれを行う:
public MyViewModel MyViewModel
{
get { return new MyViewModel(SimpleIoc.Default.GetInstance<ISomeInterface>()); }
}
この1つは私が今までMyViewModelのコンストラクタを変更した場合、私はまた、このプロパティを更新する必要がありますという欠点があります。大したことではありませんが、依然として何らかの依存関係があります。
このシナリオをどのように扱いますか、私には何かがありますか?非共有インスタンスが返されないようにした理由について説明します。
もう1つの質問は、MVVMディープダイブセッションLaurentは、特定のViewModelを登録した直後にGetInstanceメソッドを使用して、コンテナにこのViewModelのインスタンスが既に存在することを確認します。なぜこれが必要なのですか? ViewModelLocatorからViewModelをフェッチしている場合は、必要に応じて作成します。それではなぜ私はそれらを前もって作成させたいのですか?
こんにちは、Laurent、共有されていないインスタンスの場合は、キーを使用しているかどうかは関係ありません(同じビューの複数のインスタンスが同時に存在しないと仮定します)。どちらの場合も、私はビューモデルを登録/登録解除する必要があるので、それらについて追跡する必要があります。 共有インスタンスと非共有インスタンスのための登録オプションがあったとしても、それはまだ単純なIocになると思います。私はそれがちょうどコンテナに作成されたインスタンスを追加する必要はないと思いますか? – Goran
あなたのソリューションは、コンストラクタインジェクションが使用されていない場合にのみ機能します(これは良いことではありません)。コンテナが依存関係を挿入する責任がある場合、新しいインスタンスを作成してコンストラクタに挿入する方法はありません。 私のコードでSimpleIoC.GetInstance()を呼び出すことを避けようとしていますが、コンテナによっては悪い習慣です。 SimpleIoCに、新しいインスタンスを常に作成して、1つのインスタンスをキャッシュする代わりに挿入するようにするにはどうすればよいですか? SimpleIoC.Registerのシンプルな "キャッシュ"フラグで十分です。 – TheAgent