私は Prism-MEF-WPF を使用しており、ビューの XAML からビュー モデルを構築する必要がある場合があるため、コンテナーは関与せず、依存関係の注入を自動的に実行できません (VM で使用される Export 属性がないため)。 .so Prism-WPF には、CompositionInitializer のようないくつかのクラスがあり、コンテナーにインジェクションを実行するように要求できるようにする必要があります。同等のクラスがある場合は、それを使用する方法があり、同等のクラスがない場合は、xaml からビュー モデルを構築する方法があります。私がMEFを使用していることを知っているビューの。前もって感謝します。
3 に答える
問題は、パラメーターなしのコンストラクターがない場合、XAML でオブジェクトを作成できないことです。
ServiceLocator を使用すると、これを実現できます。これは IoC として機能します (そして、Prism/MEF によってセットアップされます。.dll をドロップするだけです):
xaml:
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
分離コード:
class ViewModel : NotificationObject
{
public ViewModel()
{
var firstDependency = ServiceLocator.Current.GetInstance<FirstDependencyType>();
//... more dependencies here instead of as constructor parameters
}
//class code omitted for brievity
}
Agustin Adami " http://blogs.southworks.net/aadami " から得た正しい答えは次のとおりです。
私の理解に基づいて、ビューモデルにコンストラクター引数がない場合にのみ、ビューモデルをビューの DataContext として XAML でインスタンス化できます。また、私が知る限り、Inverse of Control Container と提携して XAML で定義されたオブジェクトを作成することは、現在サポートされていません。
CompositionInitializer クラスに関しては、私が知る限り、WPF に相当するクラスはありませんが、このトピックに関しては、次のブログ記事が興味深いと思います。
•<a href="http://reedcopsey.com/2010/03/26/mef-compositioninitializer-for-wpf/" rel="nofollow">http://reedcopsey.com/2010/03/26/mef -compositioninitializer-for-wpf/ また、これに代わる方法は、このスレッドで言及されているように、CompositionContainer クラスを登録することだと思います。
http://compositewpf.codeplex.com/discussions/311933 これにより、たとえばビュー モデルのコンストラクターでこのクラスを取得できるため、SatisfyImportsOnce メソッドを呼び出して、渡されたクラスで定義されたインポートを満たすことができます。
this.compositionContainer =ServiceLocator.Current.GetInstance(); this.compositionContainer.SatisfyImportsOnce(これ);
Bootstrapperクラスはあなたが探しているものです。UnityContainer
依存関係の注入に使用します。ここのこのリンクもあなたの興味があるかもしれません..
編集
私が正しければ、このように達成できる xaml から ViewModel を作成する必要があります (ここでは、ローカルは ViewModel クラスの名前空間です) -
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>