2009-07-16 9 views
4

MVVMアプリケーションには親子のViewModelがかなりたくさんあります。このような何か:MVVMとStructureMapの使用

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

EDIT:

は、これに関連する別の質問があり、私はより多くの意見を好きな私は、この上の恵みを開きました。

答えて

0

依存性注入を使用する利点は、SchoolsViewModel自体が教師リポジトリについて知る必要がない場合、コンストラクタ内でそれを参照する必要もないということです。子供がそれについて何も知らなかったにもかかわらず、子ViewModelは引き続きteachersRepositoryでハンドルを取得することができます。これにより、親ViewModelは、実際には必要ない依存関係で汚染されることがなくなります。

1

もう1つの代替方法...

このLessonViewModelをご覧ください。生徒と教師にのみ依存し、生徒やその他の子オブジェクトについては何も知らない。

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

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 
     }; 
    } 
} 
+0

しかし、これはあまりにも複雑です... 1つのEducationFactoryを持つすべての工場を組み合わせる方がよいです。 – alex2k8

0

多分私はここで大きな画像を見ていませんか?ストラクチャーマップを使用することはできません。そのすべてを基礎にして、この汚い作業を世話してください。あなたはこの作業のすべてを世話するためにStructureMapのコンストラクタインジェクションを使用することができます。それを必要とするさまざまなオブジェクトのコンストラクタにさまざまな依存インタフェースを置く...依存関係を持つオブジェクト1をインスタンス化すると、それに依存するすべてのインタフェースとそれに関係するすべてのインタフェースがStructureMapに依存しますオブジェクト2はオブジェクト3に依存しています... StructureMapはそれをすべて処理します。

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

関連する問題