2009-07-16 5 views
4

MVVM 응용 프로그램에 많은 부모 - 상세보기 모델이 있습니다. 이런 식으로 뭔가 :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

편집 :

이 관련된 다른 질문이 좀 더 의견을 원하는만큼 나는이에 현상금을 열었습니다.

답변

0

종속성 주입을 사용하면 SchoolsViewModel 자체가 teachersRepository에 대해 알 필요가없는 경우 생성자에서 참조 할 필요가 없다는 이점이 있습니다. 자식 ViewModel은 비록 부모가 그것에 대해 아무것도 모르고 있었음에도 불구하고 teachersRepository에서 핸들을 얻을 수있었습니다. 이렇게하면 부모 ViewModel이 실제로 필요하지 않은 종속성으로 오염되는 것을 방지 할 수 있습니다.

1

또 다른 대안 ...이 LessonViewModel에서

봐. 이는 학생과 교사에게만 달려 있으며, PupilParents 나 다른 자식 개체에 대해서는 아무 것도 모릅니다.

레슨 팩토리는 필요한 모든 종속성을 포함하지만 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 
     }; 
    } 
} 
+0

그러나 이것은 너무 복잡합니다. 모든 Education Factory가 누구의 공장을 합병하는 것이 좋습니다. – alex2k8

0

아마도 여기서 큰 그림을 볼 수 없습니까? 당신은 StructureMap을 사용할 수 없으며,이 모든 것들이 당신을 위해이 더러운 일을 처리 할 수있는 토대가 될 수 있습니까? StructureMap의 생성자 삽입을 사용하여이 모든 작업을 처리 할 수 ​​있습니다. 인터페이스와 그것과 그것의 자식 들인 모든 인터페이스를 연결하는 것은 StructureMap에 의존하고 다양한 종속 인터페이스를 필요로하는 다양한 객체의 생성자에 넣는다. 의존성을 가진 객체 1을 인스턴스화 할 때 객체 2는 객체 3에 의존성을가집니다 ... StructureMap이이를 처리합니다.

어쩌면 내가 누락 되었습니까?