4

我的 MVVM 应用程序中有相当多的父详细视图模型。像这样的东西:

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

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

4

3 回答 3

1

另一种选择...

看看这个 LessonViewModel。它仅取决于 Pupils 和 Teachers,对 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 本身不需要知道,例如,teacherRepository,那么它甚至不需要在构造函数中引用它。即使父级对此一无所知,子 ViewModel 仍然能够获得有关 TeachersRepository 的句柄。这可以防止父 ViewModel 被它并不真正需要的依赖项污染。

于 2009-07-18T17:15:02.553 回答
0

也许我在这里没有看到大局?您不能使用 StructureMap 及其所有基础来为您处理这项肮脏的工作吗?您可以使用 StructureMap 的构造函数注入来处理所有这些工作。通过将接口和它及其子级所依赖的所有接口连接到 StructureMap - 并将各种依赖接口放入需要它们的各种对象的构造函数中......当您实例化对象 1 时,它依赖于对象 2 又依赖于对象 3...StructureMap 将负责这一切。

也许我错过了什么?

于 2009-07-27T07:50:54.853 回答