0

壁にぶつかった。Serviceクラスを持つ別のアセンブリの参照を追加しました。したがって、新しいインスタンスを作成する代わりに、MEFが役立ちます(ただし、役に立ちません)。HelloScreensサンプルと同様のことを行います。次のビューモデルは、モデルを保持するプロパティも受け入れます。(スタッフ)

public class StaffFormViewModel : Screen
{
    [Import]
    public StaffService staffService { get; set; }

クラスはMEFによって構築されていないため、明らかにこれは機能しません。しかし、mefで構築したかったとしても、複数のインスタンスを作成する必要があるため、NonSharedを選択する必要があります。しかし、人々はそれが遅いと言います。Caliburn microの例では、新しいインスタンスを作成するためにこのようなものを追加しています。これには、それぞれに5行のコードが必要です。

batch.AddExportedValue<Func<PreferencesCategoriesFormViewModel>>(
    () => container.GetExportedValue<PreferencesCategoriesFormViewModel>());

問題は、これを使用することはできますが、コンストラクターでモデルクラスを提供したい場合、MEFによって構築されているためにできないことです。手動で設定する必要があります。私が欲しかったのは、必要なサービスを注入することだけです。これはmefでは不可能ですか?コンテナを参照してcomposeを呼び出すことができるように、コンテナをpublic staticにする必要がありますか?助けてください :)

4

1 に答える 1

2

提供したサンプルは、の新しいインスタンスを返すファクトリを作成しているだけですPreferencesCategoriesViewModelFunc彼らは、新しいファクトリインターフェイスの作成と、コンテナへの参照を必要とするインターフェイスの実装を保存するために、組み込みのデリゲートタイプを使用しています。

したがって、MEFを介してビューモデルをインスタンス化する場合は、次のいずれかを実行できます。

  1. ビューモデルのインスタンスが1つだけ必要な場合は、コンストラクターインジェクションを介して親ビューモデルにインジェクトし、MEFに任せてインスタンス化することができます。
  2. ビューモデルのインスタンス化を制御する必要がある場合、またはビューモデルの複数のインスタンスをインスタンス化する必要がある場合は、ビューモデルのファクトリタイプを親ビューモデルに挿入できます。

ビューモデルファクトリを使用する場合は、次のことができます。

  1. 上記のように組み込みのFuncデリゲートタイプを使用Funcします。子ビューモデルにはデータが必要なため、1つ以上の入力パラメーターを受け取る他のタイプの1つをいつでも使用できます。
  2. 特定のファクトリインターフェイスと具体的な実装を作成し、それをコンテナに登録します
  3. ジェネリックビューモデルファクトリを作成し、それを注入します

オプション3の例については、http://pglazkov.blogspot.co.uk/2011/04/mvvm-with-mef-viewmodelfactory.htmlを参照してください。

彼のビューモデルファクトリにはMEFコンテナへの参照があり、実際にはMEFを介して解決していることに気付くでしょう。したがって、コンテナはそれ自体を登録する必要があります。

于 2012-11-13T23:50:19.257 に答える