MVVM 和 StructureMap 的使用

2024-02-12

我的 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:定位其他 ViewModel https://stackoverflow.com/questions/1136052/mvvm-locating-other-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
        };
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM 和 StructureMap 的使用 的相关文章

  • 如何知道 WPF 中的控件(或窗口)何时被渲染(绘制)?

    我需要将窗口的内容存储到图像中 保存并关闭窗口 如果我在 加载 事件上关闭窗口 则图像包含窗口 其中某些项目绘制正常 其他一些项目仅绘制了一半或扭曲 而其他项目则不在图像上 如果我设置一个计时器并在一定时间后关闭窗口 250 毫秒到 1 秒
  • 在约束验证器中使用 Guice 进行依赖注入

    我有一个在 ConstraintValidator 的实现中注入类的用例 我正在使用 Google guice 进行依赖项注入 目前无法在验证器内注入 我的场景的简化形式 内部模块 Provides Singleton public Ser
  • WPF C# 输入框

    我正在使用 C 构建 WPF 应用程序 我想弹出一个对话框提示用户输入他 她的名字 之后 我将跟踪该名称并将一些数据保存到 txt使用该名称的文件 例如 输入的名称是姓名 约翰 所以我有数据数据 1 2 3 然后我将 数据 保存在John
  • 将固定文档/XPS 打印为 PDF,而不显示文件保存对话框

    我有一个FixedDocument我允许用户在 WPF GUI 中预览 然后打印到纸张上 而不显示任何 Windows 打印对话框 如下所示 private void Print PrintQueueCollection printQueu
  • Laravel 5 包中依赖注入的最佳方法

    我正在为 Laravel 5 开发一个包 现在我需要受益于依赖注入来拥有一个更具可扩展性和可靠性的应用程序 我不知道最好采用哪种方法以及为什么 这是我的一段代码 我需要注射Lang类依赖 class MyController extends
  • ListView:在资源字典中定义ItemsPanelTemplate

    我有一个 ListView 其布局看起来像 Windows 资源管理器视图 图标 一些详细信息 绑定到 ViewModel 中某处的列表 我的目标是能够随时在资源管理器视图或经典视图之间切换 我可以定义一个ItemsPanelTemplat
  • 获取程序集中所有资源的列表

    我有一个文件夹Resources并想要获得一份包含所有内容的列表paths 如果我将它们设置为embedded resource 我可以通过 var resources Assembly GetExecutingAssembly GetMa
  • 带有移动向前/向后按钮的自定义列表框

    我有一个带有左 右重复按钮的自定义列表框 可以使用内容模板滚动其内容 如下所示
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 数据绑定到代码隐藏中的目标 CLR 属性

    在代码隐藏中绑定到依赖属性很容易 你只需创建一个新的System Windows Data Binding对象 然后调用目标依赖对象的SetBinding method 但是 当我们绑定的属性是 CLR 属性并且您无法提供Dependenc
  • 为什么在 Windows 中缩放 WPF 应用程序时会看到像素?

    我使用 WPF 为随机应用程序开发了一个 GUI 我在应用程序窗口上放置了一堆开箱即用的 WPF 控件 我没有定制任何东西 没有使用位图等 在 Windows 7 中运行我的应用程序并使用放大镜应用程序进行缩放时 Win key Plus
  • 如何在 WPF 中设置覆盖全局样式的特定控制元素设置?

    我通过应用程序范围的资源字典为应用程序中的按钮定义了全局样式 样式如下所示 来自另一个 SO 示例
  • GridSplitter 从右侧调整大小 - 奇怪的行为

    使用 Kaxaml 从左侧调整大小可以按预期工作
  • WPF 本地化扩展 MVVM 绑定

    我正在尝试绑定在 ViewModel 中声明的名为 SampleName 的属性 这里 SampleName 是关键 但是 当尝试下面的代码时 它显示为空
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 将 ARGB 拆分为字节值

    我有一个 ARGB 值存储为 int 类型 它是通过调用 ToArgb 来存储的 我现在想要来自 int 值的各个颜色通道的字节值 例如 int mycolor 16744448 byte r g b a GetBytesFromColor
  • 如何使用 WPF 用户控件关闭父窗口

    假设我有两个 WPF 窗口 window One 和 window Two window One 有一个按钮 单击此按钮将打开 window Two window Two contains a User Control 该用户控件有一个用于
  • 使用backgroundworker手动停止调试

    我正在编写一个 WPF C 项目 使用BackgroundWorker 带有进度条的弹出窗口 我开始调试 F5 键 来检查我的程序 之后BackgroundWorker完成并关闭弹出窗口 关闭MainWindow不会自动停止调试过程 我必须
  • WPF PRISM 事件订阅不会消亡

    我有一个 PRISM RegionManager 其中有几个区域 顶部的功能区区域和其下方用于我的视图的主要内容区域 相当基本 该应用程序以主要内容区域中的 主页 视图开始 当我单击功能区上的按钮时 我将第二个视图注入内容区域并在区域管理器
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时

随机推荐