2012-02-17 10 views
0

の自動作成を防止します。私が登録していないときにタイプ(ViewModelをViewコンストラクタにする)がUnityによって自動的に作成された型の登録の順序について、私は何度か立ち往生しました。次に、ContainerControlledLifetimeManager()を使用して型を登録しようとしました。と思ったシングルトンを作成しました。ただし、自動作成では、ビューモデルの複数のインスタンスを意味しています。プリズムとUnityは - 私はコンテナとしてプリズムとユニティを使用してWPFアプリケーションを作成していますタイプ

マペットされていない以上やっていないの明白な解決策に加えて、未登録の種類を作成し、おそらく代わりに、例外をスローユニティ自動を防止するための方法は何ですか?

答えて

1

あなたのviewmodelsのそれぞれのためのインタフェースを定義し、それに応じて登録します。あなたのコンストラクタで

public interface IViewModel 
{ 
    List<IUser> Users { get; } 
} 

public class ViewModel : IViewModel 
{ 
    List<IUser> Users { get; } 
} 

Container.RegisterType<IViewModel, ViewModel>(); 

インターフェイスタイプは、それが解決可能であるため、ユニティなどの具体的なタイプは確かにコンクリートの型のインスタンスを構築します、いない注入されていることを確認してください。インターフェイスはN個の実装を持つことができます。また

、あなたのコードは、アプリケーション全体に存在する必要のあるデータは、サービスではなく、ViewModelにを形成してくる必要があることで構築されなければなりません。 ViewModelをシングルトンにすることは、あなたのアプローチではなく、サービスを通じてデータをプロキシすることです。この方法でViewModelを自由に構築/破棄することができます。永続化したいデータは他の場所に存在します。迅速な対応のための

Container.RegisterType<IService, Service>(new ContainerControlledLifetimeManager()); 
Container.RegisterType<IViewModel, ViewModel>(); 

... 

public List<IUser> Users 
{ 
    get { return Container.Resolve<IService>().GetUsers(); } 
} 
+0

感謝。私は、データ・コンテキストを提供するビューに結びついているので、ポイントを見ることができないので、私は一般的にビュー・モデル用のインタフェースの作成には悩まされませんでした。私はこれについていくつかの長所と短所を見たことがありますが、私にとってはその過度のことです。おそらく私はこれを考え直す必要があるでしょう。したがって、設定オプションはありませんか? – pilsdumps

+0

指定したタイプを登録すると、一時的な存続期間になります。 'ContainerControlledLifetimeManager'を使うことは確かにシングルトンの動作を提供しますが、通常はViewModelでそれをやりたいとは思わないでしょう。 ViewModelは複数のビューで使用できます。さらに、テストやその他の手段のための具体的なタイプをかなり簡単に交換することができます。コンクリート型のインスタンスを作成するUnityは、私が気づいているものは設定できません。コンテナの動作です。シングルトンの例がうまくいけば、あなたの例を理解するためのコードが必要になります。 –

+0

Container.Resolve ()はひどい習慣です! サービスを通じてデータをプロキシすることは優れたアドバイスです! – aateeque

関連する問題