IOC 子コンテナーを使用している場合、ViewModelLocator パターンをどのように実装しますか? 典型的なロケーターの実装は次のようなものです:
public IViewModel ViewModel
{
get { return Services.ServiceLocator.GetInstance<IViewModel>(); }
}
ここで、Services.ServiceLocator は読み取り専用の静的プロパティです。ただし、子コンテナーを使用している場合、これはうまくいきません。子コンテナーを使用した Services.ServiceLocator の私の定義は次のとおりです。
public static IServiceLocator ServiceLocator
{
get { return RootContext.ServiceLocator; }
}
明らかにこれは正しくありません。注入された依存関係は、子コンテナーではなくルート コンテナーから取得されます。(子コンテナが作成され、現在のビュー以外のものによってブートストラップされます。したがって、現在のビューは子コンテナから自動配線できます。)
では、複数コンテナーのシナリオで適切なコンテナーを取得するにはどうすればよいでしょうか? 標準的な答えは、コンストラクターを挿入することですが、ViewModelLocator ではそれができないようです。XAML から構築できるように、既定のコンストラクターが必要です。
また、私は PRISM 複合アプリケーションで作業しているため (したがって、マークアップ拡張機能はありません)、Silverlight 4 と WPF 4.0 の両方で機能するソリューションを求めています。たまたま Unity を IOC コンテナーとして使用しています。ああ、ソリューションは Blend で機能するはずです (つまり、IoC コンテナーをバイパスする新しい設計時のビュー モデルの作成を妨げるべきではありません)。