2009-07-16 98 views
4

我在我的MVVM应用程序中有相当多的parent-detail ViewModels。事情是这样的:MVVM和StructureMap使用

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

等等......

此外,单一的视图模型可以出现在多个位置,这取决于用户是否被课或学生等浏览

每个子视图模型是由父视图模型创建的,那么多视图模型的需要有传入的子视图模型的依赖性例如,对于SchoolsViewModel的构造可能是:

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

现在,使所有这些易于管理的通常方法是使用一个DI框架(如StructureMap)将所有必需的参数传递给视图模型。但是,因为在这种情况下,我的应用程序通常只会创建SchoolsViewModel,这是有限的使用。

我的第一个问题是,在这种情况下,您是否将SchoolsViewModel传递给每个子视图模型的每个依赖项,还是让每个视图模型使用ObjectFactory.GetInstance()创建子视图模型?也许通过工厂类来抽象出DI框架的依赖关系?

有与此另一个问题:MVVM: locating other ViewModels

编辑:我已经打开了这个赏金,因为我想更多的意见。

回答

0

使用依赖注入的好处是,如果SchoolsViewModel本身不需要知道关于,例如,教师库,那么它甚至不需要在构造函数中引用它。尽管父母对此一无所知,但子ViewModel仍然能够处理teachersRepository。这可以防止父视图模型受到其实际并不需要的依赖关系的污染。

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

但我恐怕这太复杂了......最好有一个教育工厂结合所有的工厂。 – alex2k8 2009-07-23 13:16:42

0

也许我没有看到大局吗?你不能使用StructureMap和它的所有基础来帮你照顾这个肮脏的工作吗?您可以使用StructureMap的构造函数注入来处理所有这些工作。通过连接一个接口以及它和它的子接口所依赖的所有接口,并将各种依赖接口放入需要它们的各种对象的构造函数中...当实例化具有依赖关系的对象1时对象2反过来依赖于对象3 ... StructureMap将全​​部处理。

也许我错过了什么?