2012-03-26 4 views
0

良いMVVMプログラムを作成したいとき、Viewのコードの中でUnityContainerを使うことはできますか?ViewのコードビハインドでUnityCOntainerを使用できますか? (MVVM)

this.DataContext = uc.Resolve<MainViewModel>(); 
+0

はいできます。ここで深い質問がありますか?それをやろうとしましたが、エラーが発生しましたか?ベストプラクティスについて質問していますか? – cadrell0

+0

これは私が今知りたいことでした:)しかし、あなたがすでにここにいたら、ビューDataContextを設定するベストプラクティスは何ですか? – Arvangen

答えて

1

ServiceLocatorはアンチパターンですので、使用しないでください。反パターンの理由は、いつでもクラス内でオブジェクトを解決できるため、DIの有用性が減り、コードを単体テストにするのが困難になるからです。

私の提案は、次のいずれかを実行するために、次のようになります。

a)は、それのコンストラクタを通じてビューにのviewmodelを注入します。 Unityを使用してビューを解決し、すべてのビューの依存関係(ビューモデル)を解決します。

だから:

パブリックパーシャルクラスView:ユーザーコントロール、IViewFoo {パブリックビュー(IViewModelビューモデル) { のDataContext =ビューモデル。 }

var view = _container.Resolve(); }

B)

あなたのためのDataContextにのviewmodelを注入する添付プロパティを使用します。 MEFEDMVVMとMVVMLiteの両方がこれを行う(CodePlexに上でそれらを見て)

C) はviewmodelのは、彼らが互換性のある名前(MainView.csとMainViewModel.cs)を有することに基づいてビューに割り当てられます規則ベースのアプローチに従ってください。 Caliburn Microはこれを行い、使用することは非常にうれしいです。これはCodePlexでも見ることができます。

+0

非常に有用な、thx! – Arvangen

2

できるかどうかを尋ねる場合は、はい。

必要があるかどうかを確認する場合は、答えは「はい」です。

+0

私は同意しますが、ServiceLocatorを使用することで、コンテナをあちこちに渡す必要はありません。 – cadrell0

+0

MVVMパターンの単一のコンテナへの参照を実際には持たないはずのコンストラクタインジェクションを使用するのが最もよい方法でしょうか? –