1

ViewModelLocator を使用してビューにデータコンテキストを設定するコードがたくさんあります。

現在、単純なサービス ロケーター (Simple Injector / CuttingEdge.ServiceLocation) を使用しているため、パラメーターなしのコンストラクターを持つ ViewModelLocator を Window または UserControl.Resources の XAML からインスタンス化し、DataContext の設定に使用できます。

私は Ninject を使用するように変更中ですが、同じ方法で ViewModelLocator を引き続き使用できると考えていました。しかし、Ninject はサービスの場所を直接サポートしていないことがわかりました (そして、サービスの場所は支持されなくなった概念のようです)。

XAML から (ViewModelLocator 派生クラスを使用して) ビューのビューモデルを指定し続けたいのですが、Ninject でこれを行う方法がわかりません。

これを行う方法が見つかりません。IServiceLocator (または同様のもの) をサポートする IoC コンテナーなしで、他の開発者はどのようにこれを行っていますか?

ノート:

4

1 に答える 1

2

実際、概念としてのサービス ロケーターは支持されなくなりつつあります。ただし、場合によっては、ViewFirst アプローチを行うときに説明したように、XAML マークアップで ViewModel をインスタンス化する必要があります。そうしないことを強くお勧めし、ViewModelFirst アプローチに戻りますが、一度に世界全体を変更することはできないことを理解しています。オリジナルの caliburn フレームワークには、XAML コードからインスタンスを解決できるマークアップ拡張機能がありました。IoCCaliburn には、静的クラスからアクセスできるある種のコンテナ抽象化がありました。マークアップ コードは次の場所にあります。

http://caliburn.codeplex.com/SourceControl/latest#src/Caliburn.PresentationFramework/ResolveExtension.wpf.cs

のようにサービス ロケーターの抽象化を使用するのではなくMicrosoft Common Service Locator、静的グローバルを直接呼び出しIResolutionRoot、カスタム実装されたマークアップ拡張機能を使用してそこからインスタンスを解決することをお勧めします。それを実装するのはそれほど難しいことではありません。それが整ったらすぐに、ソリューションを VMFirst アプローチに再設計し始めます。これにより、Locator によって依存関係を解決する必要がなくなり、より反転した制御アプローチに傾くことができます。

于 2013-08-07T17:12:41.713 に答える