4

MVVM アプリケーションには、非常に多くの親詳細 ViewModel があります。このようなもの:

SchoolsViewModel
  +- SchoolViewModel
      +- LessonViewModel
          +- PupilsViewModel
              +- PupilViewModel
          +- TeacherViewModel
      +- PupilsViewModel
          +- PupilViewModel
              +- LessonsViewModel
      +- TeachersViewModel

等々...

さらに、ユーザーがレッスン単位でブラウジングしているか生徒単位でブラウジングしているかなどに応じて、単一のビュー モデルが複数の場所に表示される場合があります。

各子ビュー モデルは親ビュー モデルによって作成されるため、ビュー モデルの多くは子ビュー モデルの依存関係を渡す必要があります。たとえば、SchoolsViewModel のコンストラクターは次のようになります。

SchoolsViewModel(ISchoolsRepository schoolsRepository,
                 ILessonsRepository lessonsRepository,
                 IPupilsRepository pupilsRepository,
                 ITeachersRepository teachersRepository,
                 ...)

これらすべてを扱いやすくする通常の方法は、StructureMap などの DI フレームワークを使用して、必要なすべての引数をビュー モデルに渡すことです。ただし、この場合、私のアプリケーションは通常、SchoolsViewModel のみを作成するため、これは使用が制限されます。

私の最初の質問は、この場合、SchoolsViewModel が各依存関係を各子ビュー モデルに渡すようにするか、それとも各ビュー モデルが ObjectFactory.GetInstance() を使用して子ビュー モデルを作成するようにするかということです。おそらく、ファクトリ クラスを介して DI フレームワークへの依存関係を抽象化するのでしょうか?

これに関連する別の質問があります: MVVM: locating other ViewModels

編集:もっと意見が欲しいので、これについて報奨金を出しました。

4

3 に答える 3

1

もう1つの選択肢...

このLessonViewModelを見てください。それは生徒と教師にのみ依存し、PupilParentsやその他の子オブジェクトについては何も知りません。

public class LessonViewModel
{
    private IPupilsFactory _pupilsFactory;
    private ITeachersFactory _teachersFactory;

    public LessonViewModel(IPupilsFactory pupilsFactory, ITeachersFactory teachersFactory)
    {
        _pupilsFactory = pupilsFactory;
        _teachersFactory = teachersFactory;
    }

    public string Name { get; set; }
    public List<string> PupilNames { get; set; }
    public string TeacherName { get; set; }

    public PupilViewModel GetPupil(string name) 
    {
        return _pupilsFactory.Create(name);
    }

    public TeacherViewModel GetTeacher()
    {
        return _teachersFactory.Create(TeacherName);
    }
}

レッスンファクトリには必要なすべての依存関係が含まれていますが、PupilParentsについても何も知りません。

public interface ILessonsFactory
{
    LessonViewModel Create(string name);
}

public class LessonsFactory : ILessonsFactory
{
    private ILessonsRepository _lessonsRepository;
    private IPupilsFactory _pupilsFactory;
    private ITeachersFactory _teachersFactory;

    public LessonsFactory(ILessonsRepository lessonsRepository, IPupilsFactory pupilsFactory, ITeachersFactory teachersFactory)
    {
        _lessonsRepository = lessonsRepository;
        _pupilsFactory = pupilsFactory;
        _teachersFactory = teachersFactory;
    }

    public LessonViewModel Create(string name)
    {
        Lesson lesson = _lessonsRepository.Read(name);

        return new LessonViewModel(_pupilsFactory, _teachersFactory) {
            Name = lesson.Name,
            PupilNames = lesson.PupilNames,
            TeacherName = lesson.TeacherName
        };
    }
}
于 2009-07-22T20:21:39.073 に答える
0

依存性注入を使用する利点は、SchoolsViewModel 自体が、たとえば、teachersRepository について知る必要がない場合、コンストラクターでそれへの参照さえ必要ないことです。親がそれについて何も知らなかったとしても、子のViewModelはteachersRepositoryのハンドルを取得できます。これにより、親 ViewModel が実際には必要のない依存関係で汚染されるのを防ぎます。

于 2009-07-18T17:15:02.553 に答える
0

おそらく私はここで全体像を見ていませんか?StructureMap とそのすべての基盤を使用して、この汚れた作業を処理することはできませんか? StructureMap のコンストラクター インジェクションを使用して、このすべての作業を処理できます。インターフェースと、それとその子が依存しているすべてのインターフェースを StructureMap に接続し、さまざまな依存インターフェースを、それらを必要とするさまざまなオブジェクトのコンストラクターに配置することにより、依存関係を持つオブジェクト 1 をインスタンス化するときにオブジェクト 2 はオブジェクト 3 に依存しています...StructureMap がすべて処理します。

多分私は何かを逃していますか?

于 2009-07-27T07:50:54.853 に答える