2

LoginViewがあり、そのデータコンテキストLoginViewModelに、ユーザー名/パスワードに基づいてユーザーを認証できるサービスを注入する必要があるとします。

ここで、アプリケーションの状態として、誰かがすでにログインしているが、ログアウトしているため、次のユーザーのログイン画面を再表示する必要があるとします。したがって、この時点でLoginViewModelのインスタンスが必要ですが、それを取得する方法がわかりません。

LoginViewModelをShellViewModelに挿入し、それを保持して再利用する必要がありますか?なぜ私がそれを使用していない間それをメモリに保持したいので、それは奇妙に思えます(もちろん、この場合は大したことではありませんが、他の場合にはそうなる可能性があります)。

LoginViewModelを作成する必要があるときはいつでも保持するために、認証サービスをShellViewModelに注入する必要がありますか?私のShellViewModelはこのサービスで何もする必要がないので、それは奇妙に思えます。これが答えである場合、表示される他のすべてのViewModelのShellViewModelにあらゆる種類のものを挿入します。

また、アプリケーションのルート以外の場所でDIコンテナを参照することは想定されていないか、ServiceLocatorパターンを実装することになっています。

確かに、今はかなり馬鹿げているし、答え​​を聞いたら顔を平手打ちするのは間違いない…だから何?

4

2 に答える 2

1

このようなシナリオでは、通常、あなたの場合、LoginViewModelファクトリに対応するものを注入します。そうすれば、ロジックは必要に応じて新しい(またはファクトリによってキャッシュされた)インスタンスを作成できます。

于 2013-01-31T17:41:16.290 に答える
1

過去数時間、このテーマに関するさまざまなブログ、質問、および回答を調べただけで、Asp.net MVC などのフレームワークが純粋主義者 (別名 Mark Seemann のような人) を実装するという結論に達し始めています。 ) アプローチは非常に実行可能です。

このようなフレームワークは、フレームワーク自体が (あえぎ!!!) Service Locator パターンを利用しているため、これを可能にする傾向があります。残念ながら、WPF のようなプラットフォームで MVVM 設計を使用することは、組み込みの Service Locator の助けを借りてビューが常にルートから提供されるとは限らないという性質のため、それほど簡単にはなりません。

ただし、必要なほとんどのビューを表示する役割を担う ShellViewModel があるため、ここで最も実用的な答えは、ShellViewModel をコンポジション ルートの一部と見なし、DI コンテナーへの依存関係を拡張することだと思います。 .

ただし、私の ShellViewModel のポイントを超えて、500 の答えは正しいと思います。

于 2013-01-31T21:34:34.057 に答える