0

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 コンテナーをバイパスする新しい設計時のビュー モデルの作成を妨げるべきではありません)。

4

1 に答える 1

1

一般に、子コンテナはルックアップ階層を定義します。ただし、ベースコンテナは子コンテナを作成する必要があります-それ自体をパラメータとして渡します。

子コンテナにアクセスするために、子コンテナを返すプロパティ(シングルトンインスタンスまたは一時的な(つまり新しい)インスタンス)を持つことができます。ただし、ブレンド可能性が必要な場合は、設計時に子コンテナーをリソースにバインドする必要があることに注意してください。

いずれの場合も、メモリリークが発生しないように、ViewModelのインスタンスが適切にクリーンアップされていることを確認する必要があります。

編集: あなたの特別な場合には、これは役に立つかもしれません。ビデオを見る時間がありませんでしたが、Laurentは、ビューモデルを動的にロードする方法を示していると言っていました。これがお役に立てば幸いです。

于 2011-06-14T18:34:13.127 に答える