Использование MVVM и StructureMap - PullRequest
4 голосов
/ 16 июля 2009

В моем приложении MVVM достаточно большое количество моделей ViewModel для родительских деталей. Примерно так:

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: поиск других моделей представления

РЕДАКТИРОВАТЬ: я открыл щедрость на это, как я хотел бы больше мнений.

Ответы [ 3 ]

1 голос
/ 23 июля 2009

Еще одна альтернатива ...

Посмотрите на эту 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 голосов
/ 27 июля 2009

Может быть, я не вижу здесь общую картину? Разве вы не можете использовать StructureMap и все его основы, чтобы позаботиться об этой грязной работе для вас? Вы можете использовать инъекцию конструктора StructureMap, чтобы позаботиться обо всей этой работе. Путем подключения интерфейса и всех интерфейсов, от которых он и его дочерние элементы зависят от StructureMap, и помещения различных зависимых интерфейсов в конструктор различных объектов, которые в них нуждаются ... при создании экземпляра объекта 1, который зависит объект 2, который, в свою очередь, зависит от объекта 3 ... StructureMap позаботится обо всем этом.

Может быть, я что-то упустил?

0 голосов
/ 18 июля 2009

Преимущество использования внедрения зависимостей состоит в том, что если самому SchoolsViewModel не нужно знать, скажем, о teacherRepository, то ему даже не потребуется ссылка на него в конструкторе. Дочерний ViewModel по-прежнему сможет получить указатель на учителяRepository, даже если родитель ничего не знал об этом. Это предотвращает загрязнение родительского ViewModel зависимостями, которые ему на самом деле не нужны.

...