我在我的MVVM应用相当多家长详细的ViewModels的。 事情是这样的:
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:定位等的ViewModels
编辑:我已经打开了这个赏金,因为我想更多的意见。
另一种替代...
看看这个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
};
}
}
使用依赖注入的好处是,如果SchoolsViewModel本身并不需要知道,比方说,teachersRepository,那么它甚至不需要在构造函数的引用。 子视图模型仍然能够得到一个手柄上teachersRepository即使父一无所知。 这可以防止父视图模型所用,它并不真正需要依赖污染。
也许我没有看到大局吗? 你不能使用StructureMap和它的所有基础要为你这个肮脏的工作,照顾? 您可以使用StructureMap的构造函数注入承担所有这些工作的关心。 通过挂钩的接口和所有它和它的孩子都依赖于对StructureMap的接口 - 并把各种相关的接口到需要它们的各种对象的构造函数...当你实例化对象1,其上有扶养对象2,它反过来又对对象3扶养... StructureMap将采取一切照顾。
也许我失去了一些东西?