【问题标题】:MVVM with XML Model and LinqToXml?带有 XML 模型和 LinqToXml 的 MVVM?
【发布时间】:2009-07-15 18:36:41
【问题描述】:

我一直在阅读 MVVM 模式,我想在一个相对较小的 WPF 项目中尝试一下。该应用程序将是单用户的。输入和输出数据都将存储在“关系”XML 文件中。带有 Keys 和 KeyRefs 的架构(XSD 文件)用于验证文件。

我也开始涉足 Linq 和 LinqToXml,并且我编写了几个非常复杂的查询,它们确实有效(小胜利:))。

现在,我正在尝试将所有内容放在一起,但我发现对于 Model 和 ViewModel 中应该包含哪些内容我有些困惑。以下是我迄今为止一直在努力的选项:

  1. 我是否应该将模型视为 XML 文件本身并将所有 LinqToXml 查询放在 ViewModel 中?也就是说,连一个叫Model的类都不写?
  2. 我是否应该编写一个模型,它只是 XML 文件和 XSD 架构集的简单包装器并执行验证、保存更改等?
  3. 我应该在模型中放置“基本”查询,在 ViewModel 中放置“特定视图”查询吗?如果是这样,我应该在哪里划定这两个类别之间的界限?

我意识到这个问题不一定有一个“正确”的答案......我只是在寻找建议和优缺点,如果有人知道类似场景的代码示例,那就太好了.

谢谢,

-丹

【问题讨论】:

    标签: wpf xml mvvm xsd linq-to-xml


    【解决方案1】:

    对于小型应用程序,拥有单独的数据访问、域模型和表示模型层可能看起来有点矫枉过正,但像这样对应用程序进行建模将有助于您决定将哪些内容放在哪里。即使您不想将应用程序分解为三个不同的项目/库,考虑每个功能的去向也可以帮助您做出决定。

    因此,纯数据访问(即加载 XML 文件、查询和更新它们)属于数据访问层,因为这些是特定于技术的。

    如果您有任何与您的特定数据访问技术无关的操作,但可能被视为在您的应用程序域中普遍适用,则这些操作应进入域模型(或某些人称之为业务逻辑)。

    任何唯一目的是为特定用户界面技术(在您的情况下为 WPF)提供特定功能的逻辑都应该进入演示模型。

    在您的情况下,XML 文件和所有 LINQ to XML 查询都属于数据访问层。

    要利用 MVVM,您需要为您希望在应用程序中拥有的每个视图创建一个 ViewModel。

    根据您的问题,我不清楚您是否有任何可以被视为领域模型的东西,但是像验证这样的东西是一个很好的候选者。这样的功能应该进入领域模型。域模型中的任何类都不应直接绑定到视图。相反,在域模型和视图之间进行转换是 ViewModel 的责任。

    所有 WPF 特定的东西都应该放在 ViewModel 中,而应用程序中的其他类应该不知道 WPF。

    【讨论】:

    • 谢谢,马克。所以,听起来我需要在我的问题中比 #3 更进一步,并将 all 查询放入模型(域模型)中,即使我编写了查询以支持特定视图。我看到了这样做的几个优点:(1) 我可以将我的 XML 数据库切换为 SqlServer 数据库,并且我的 ViewModel 不必更改(特别是如果我为我的模型编写接口)。 (2) 如果编写了一个特定的查询来支持视图 A,但后来我意识到视图 B 需要相同的数据,我不需要进行任何重构来访问数据。缺点是模型中有很多“自定义”的东西。
    • @DanThMan:是的,你自己已经列出了好处 :) 与往常一样,优点总是伴随着缺点;在这种情况下,主要缺点是增加了复杂性。您需要在应用程序的上下文中权衡利弊,但对于除了最简单的应用程序之外的所有应用程序,优点远远超过缺点。我唯一的更正是所有查询都需要进入数据访问层并隐藏在不透明的方法后面 - 而不是在域模型中。
    【解决方案2】:

    Scott Hanselmen 的播客与 Ian Griffiths 一起详细讨论了这个主题,Ian Griffiths 对 WPF 非常了解,并与人合着了 O'Reilly 的一本名为“Programming WPF”的书。

    由 Ian Griffiths 解释的 Windows Presentation Foundation
    http://hanselminutes.com/default.aspx?showID=184

    简短(非常不完整)的答案是视图包含可视对象和操作它们的最少逻辑,而视图模型包含这些对象的状态

    但请听播客。伊恩说得比我好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2012-12-27
      相关资源
      最近更新 更多