4

CaliburnとC#を使用していますが、これは一般的なMVVM/DIの質問のようです。

Noteというモデルオブジェクトが渡されるビューモデルNoteViewModelがあるとしましょう。

ここにいくつかのコードがあります:

class NoteViewModel : PropertyChangedBase
{
  private readonly Note _note;

  public NoteViewModel(Note note)
  {
    _note = note;
  }

  public string Title
  { 
    get { return _note.Title; } 
    set { _note.Title = value; NotifyOfPropertyChange(() => Title); }
  }
}

現在、このオブジェクトはnew()を呼び出し、モデルオブジェクトを渡すことによって作成されています。

これはうまく機能しますが、DIコンテナからインポートされたクラスを必要とするメソッドを追加する必要があります。

それで、それを取得するために単にServiceLocator.Current.GetInstance()を呼び出すだけですか?または、このビューモデルをDIコンテナを介して作成するように設計し、Noteオブジェクトを渡す方法を設定する必要がありますか?

このビューモデルを設計する適切な方法は何ですか?基本的に、使用するためにモデルオブジェクトを必要とする「PerInstance」ビューモデル。Caliburnには、これを行うための組み込みの方法がありますか?

4

3 に答える 3

3

Caliburn には、この種のシナリオに対処するインターフェイス (IHaveSubject とその型付きバージョン IHaveSubject) があります。

class NoteViewModel : PropertyChangedBase, IHasSubject<Note> {
  ...   
} 

myNoteViewModel = ... //obtain an instance
myNoteViewModel.WithSubject(new Note());

このソリューションは、ISubjectSpecification / Conductor インフラストラクチャともうまく統合されます。

構築後の初期化は単純で効果的なソリューションですが、(純粋な設計の観点から) 明示的なコンストラクター パラメーターを放棄して、ViewModel をインスタンス化するための Note の必要性を強制することは望ましくない場合があります。この場合、「実際の」入力パラメーターを表すコンストラクターのいくつかのパラメーターがあり、他のパラメーターがサービスの依存関係である可能性があるため、DI コンテナーの固有の機能を活用する必要があると思います。

たとえば、Castle Windsor には、ViewModel の明示的な (型指定された) ファクトリをすばやく構築できる優れた機能があります。ファクトリ メソッドでは、「実際の」パラメーターの設定のみが許可されますが、すべての依存関係はコンテナーによって管理されます (このウィンザー機能の詳しい説明については、この投稿を参照してください: http://kozmic.pl/archive/2009/12/24 /castle-typed-factory-facility-reborn.aspx )

于 2010-07-27T16:58:33.477 に答える
0

ServiceLocator も使用しています。そして、私はこれを行うことで「汚れを感じます」。しかし、私は YAGNI 原則を使用し、5 つの IServices をコンストラクターに追加し、3 ~ 4 層の継承を介してそれらが必要な基本クラスにそれらを渡すという複雑さに対する説得力のある見返りが見つかるまで、このパターンを維持することを決定しました。コンテナを介してすべてを作成します。もちろん、私のアプリは進化しており、YAGNI は常に続くわけではありません...

于 2010-07-27T19:31:58.800 に答える
0

階層ビューモデルを使用して解決できますか?

より大きなアプリケーションを構築する場合、View ごとに1 つの ViewModel が必要であり、モデル アイテムまたはコレクションごとに1 つの ViewModel が必要であることがますます明確になっています。

そうすれば、XAML 階層に合わせて ViewModel を階層的に構築できます。

必要なオブジェクトは、アプリのメイン ビュー モデルによってトップ レベルで定義または挿入できます。入れ子になったビューモデルは、あなたが設計した方法で何にでもアクセスできるようになり、到達可能になります。

Caliburn については、そのフレームワークについて具体的なことはわかりません。申し訳ありません。

于 2010-07-27T16:13:20.240 に答える