MVVM和StructureMap使用(MVVM and StructureMap usage)

2019-09-19 04:18发布

我在我的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

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

Answer 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
        };
    }
}


Answer 2:

使用依赖注入的好处是,如果SchoolsViewModel本身并不需要知道,比方说,teachersRepository,那么它甚至不需要在构造函数的引用。 子视图模型仍然能够得到一个手柄上teachersRepository即使父一无所知。 这可以防止父视图模型所用,它并不真正需要依赖污染。



Answer 3:

也许我没有看到大局吗? 你不能使用StructureMap和它的所有基础要为你这个肮脏的工作,照顾? 您可以使用StructureMap的构造函数注入承担所有这些工作的关心。 通过挂钩的接口和所有它和它的孩子都依赖于对StructureMap的接口 - 并把各种相关的接口到需要它们的各种对象的构造函数...当你实例化对象1,其上有扶养对象2,它反过来又对对象3扶养... StructureMap将采取一切照顾。

也许我失去了一些东西?



文章来源: MVVM and StructureMap usage