【问题标题】:What framework for MVVM should I use? [closed]我应该使用什么 MVVM 框架? [关闭]
【发布时间】:2010-11-27 10:18:48
【问题描述】:

我正在使用 MVVM 模型开发应用程序,但我已经到了需要选择使用哪个框架的地步。

可能的选项包括:

  • MVVM 工具包
  • MVVM 基础
  • WPF 应用程序框架 (WAF)
  • 轻量级 MVVM
  • 卡利本
  • 收紧
  • 棱镜
  • 反应式用户界面

根据您的经验,哪个更好?

【问题讨论】:

  • +1 - 好问题,但请澄清“更好”。不同的框架提供不同的优势,最好的取决于您的要求。期待答案:)
  • 如果您可以使用 WPF 和 Silverlight 并且学习曲线最短,那就太好了。
  • 您可能也想看看 Caliburn。 codeplex.com/caliburn
  • 对不起肯特。我怎么会忘记 Caliburn?
  • 关闭和旧但是...我使用 Prism 完成了我的第一个项目(答案如下),因为我需要组件支持。我做的最后一个项目是原始的 - 根本没有框架。您所需要的只是一个命令类,并且您可以在没有框架的情况下执行 MVVM - 这是您可以获得的轻量级。

标签: wpf mvvm frameworks


【解决方案1】:

这实际上取决于您要实现的目标,以及您需要多少基础设施,以及您可以轻松找到可以帮助您的示例。我要在这里声明一个兴趣,因为我已经积极参与了至少一个 MVVM 框架,并且我通过 WPF Disciples 组向其他人提供了输入,所以我有点偏见。说了这么多,就这样吧:

Microsofts MVVM Toolkit - 这仍处于 Alpha 阶段。最初发布的时候,因为没有做的事情,受到了门徒们的一些诟病。话虽如此,MS 正在寻求加强这个框架,所以它是值得关注的——它还没有准备好。

MVVM Foundation - 啊 Josh Smith 的框架版本。 Josh 是 MVVM 的父亲之一,并且一直是该模式的大力倡导者和老师。因此,您会在其他框架中找到的很多内容都带有 Josh 的指纹。该框架旨在提供 MVVM 的基础知识,而不是解决一些更深奥的问题。最初这仅适用于 WPF,但像 Laurent Bugnion 和我这样的人已经添加了功能/项目,这意味着这也将是一个与 Silverlight 兼容的框架。

WAF - 没有经验,所以恐怕无法评论。

MVVM Light - Laurent Bugnion 采用它,并且刚刚更新到版本 2。这是一个非常好的框架,但它并不打算涵盖 MVVM 应用程序的每个方面。鉴于 Laurent 的背景,它拥有非常强大的 Silverlight 和 Blendability 支持。

更新 Laurent 刚刚通知我,.NET 3.5 和 .NET 4.0 版本的功能兼容。 Wau 去 Laurent。

Cinch - Sacha Barber 出色的仅 WPF MVVM 框架。这比我上面谈到的框架涵盖的范围更广。这是一个出色的框架,并利用了 Bill Kempf 出色的 Onyx 项目中涵盖的概念。 Onyx 旨在补充 MVVM 框架,并添加人们在 MVVM/WPF 中通常很难做到的功能。同样,最初只打算成为 WPF,Onyx 已经发展到包括 SL 兼容性 - 我特别自豪地参与了这项工作。

Prism - 再说一次,我从未使用过它,但我听说过很多关于它的好消息。

Ocean - Cider 团队的项目经理 Karl Shifflett 最近发布了一个功能齐全的 WPF MVVM 框架。同样,这是一个出色的框架,有很多值得推荐的地方。

最重要的是,下载不同的框架,看看它们,找出最符合您的思维方式和要求的框架。如果您认为您可能希望从同一代码库支持 Silverlight,那么仅 WPF 的框架应该打折。

【讨论】:

  • 我使用我们编写的一个,因为我们对 MVVM 有非常专业的需求。它深受 Josh 所做工作的影响,我将在不久的将来将它作为开源发布(我正忙于剥离专有位)。它叫做金光。
  • 除此之外,您的数据访问层框架是什么?伙计们.. LINQ、LLBLGen、EF、nHibernate?
  • 这取决于项目和要求。有时我们使用 LINQ,有时使用 NHibernate,有时使用 Castle ActiveRecord,有时使用 eXpress Persistent Objects。
  • 嗨皮特,只是想评论一下 MVVM Light Toolkit 对于 WPF 3.5 和 WPF 4 的工作方式与 Silverlight 3 和 Silverlight 4 的工作方式相同。我能。不过,您对可混合性的看法是对的,这对我来说是一个主要问题:) 干杯,Laurent
  • 我很失望 MVVM 工具包尚未更新以与 Visual Studio 2010 一起使用。可能希望将其添加到决策过程中。我认识的大多数在 2010 年使用 MVVM 模板的人都在使用 MVVM Light,其中一些人仅仅因为这个原因而迁移到该模板。
【解决方案2】:

我发现这篇文章非常有用http://www.japf.fr/2009/10/a-quick-tour-of-existing-mvvm-frameworks/ 所以我把它带到这里给即将到来的用户

我更新了 Cinch 部分并为其功能添加了 Silverlight 支持

对不起,说来话长了

共同特点:

• ViewModelBase 类(用于实现 INotifyPropertyChanged 接口)

• RelayCommand 类将 UI 命令链接到 ViewModel 的处理程序

• 框架自带单元测试

收紧

• 作者:Sacha Barber

• Silverlight 支持:否(Cinch 版本 2 支持 Silverlight)

• 文档:优秀,在 CodeProject 上发表了 6 篇文章

• 托管:CodePlex

• 许可证:代码项目开放许可证

• 特点:

  1. 附加行为

  2. 使用 IDataErrorInfo 进行验证

  3. 支持 IEditableObject

  4. 弱事件创建和订阅

  5. 使用弱事件的中介消息传递

  6. IOC/DI 支持(使用 Unity)

  7. 服务:事件记录器、消息框、打开保存对话框、弹出窗口

  8. 线程助手

  9. 支持菜单项

  10. 可关闭的视图模型

  11. MVVM 代码生成器

MVVM 轻量级工具包

• 作者:Laurent Bugnion

• Silverlight 支持:支持

• 文档:Laurent 的博客和其他开发人员也提供了许多文章

• 托管:CodePlex

• 许可证:MIT 许可证

• 特点:

  1. MSI 安装程序

  2. VS 项目和项模板

  3. VS 代码 sn-ps

  4. 用于视图模型间通信的信使系统

  5. 将事件作为命令处理

MVVM 助手

• 作者:马克·史密斯

• Silverlight 支持:无

• 文档:Mark 博客上的一些文章

• 托管:个人网站

• 许可证:未定义

• 特点:

  1. 附加行为

  2. 使用标记扩展创建视图模型

  3. 基于属性的验证

  4. IOC/DI 使用 ServiceProvider 方法

  5. 可关闭的视图模型

  6. 等待光标(使用 new WaitCursor() { // 你的代码在这里 })

MVVM 基金会

• 作者:乔什·史密斯

• Silverlight 支持:无

• 文档:Josh 或 Marlon Grech 博客上有关 Messenger 实现的文章

• 托管:CodePlex

• 许可证:MS-PL

• 特点:

  1. 用于视图模型间通信的信使系统

  2. PropertyChanged 事件监视器

Caliburn

• 作者:罗伯·艾森伯格

• Silverlight 支持:支持

• 文档:提供完整的在线文档

• 托管:CodePlex http://www.codeplex.com/caliburn

• 许可证:MIT 许可证

• 特点:

  1. 命令构建在 Action 之上,因此具有许多相同的功能,包括多个输入参数、过滤器和自动异步执行

  2. 处理 UI 生命周期问题的演示者,例如处理各种 UI 组件的激活、停用和关闭语义

  3. Caliburn 应用程序是完全可测试的

  4. 各种实用程序,例如后台任务管理器

  5. 支持各种 UI 模式(不仅限于 MVVM)

  6. 依赖注入容器

缟玛瑙

• 作者:William e Kempf

• Silverlight 支持:无

• 文档:CodePlex 上提供的基本介绍

• 托管:CodePlex

• 许可证:未指定

• 特点:

  1. ServiceLocator 模式

  2. 使用自定义标记扩展创建 ViewModel

  3. IDisplayMessage等UI相关服务

• 作者:丹尼尔·沃恩

• Silverlight 支持:无

• 文档:关于 CodeProject 的 2 篇非常详细的文章(第 1 部分和第 2 部分)

• 托管:CodePlex

• 许可:使用、复制、修改和/或分发和保留版权!

• 特点:

  1. 用于在运行时启用或禁用模块的模块管理器

  2. 使用相同 API 从客户端或服务器与用户交互的消息服务

  3. 将 WPF ICommands 与仅在活动视图或视图模型实现接口时才变为活动的内容接口相关联的命令服务

  4. 工具栏和菜单的区域适配器

  5. 客户端-服务器日志记录可以开箱即用

  6. 包括模块,例如 Web 浏览器、文本编辑器、输出窗口等等

  7. 带有脏文件指示的选项卡式界面(可跨模块重复使用)

nRoute

• 作者:Rishi

• Silverlight 支持:支持

• 文档:作者博客上提供了许多文章(有关链接,请参见 CodePlex 项目主页)

• 托管:CodePlex

• 许可证:MS-PL

• 特点:

  1. 支持 Blend3 行为和触发器模型

  2. 资源定位器框架

  3. 查看服务:OpenFileDialog、ShowMessage…

  4. 使用属性将 View 和 ViewModel 映射在一起

Nito MVVM

• 作者:沙玛

• Silverlight 支持:无

• 文档:无

• 托管:CodePlex

• 许可证:未指定

• 特点:

  1. ICommand 接口的各种 MVVM 友好实现

海洋

• 作者:Karl Shifflet

• Silverlight 支持:无

• 文档:Karl 博客上提供的文章

• 托管:个人网站

• 许可证:未指定

• 特点:

  1. 用 VB.Net 编写

  2. 基于属性的验证

  3. viewmodel 基类:relaycommand、closeableviewmodel…

  4. SQL 服务器数据访问层

基本 MVVM 框架

• 作者:莱斯特·洛博

• Silverlight 支持:无

• 文档:库中提供的示例应用程序

• 托管:CodePlex

• 许可证:MS-PL

• 特点:

  1. 委派命令\键绑定

  2. VM 之间的消息传递

  3. 将事件作为带有附加行为的命令处理

  4. 将对话框(及更多)作为服务处理

  5. VS 代码 sn-ps

好光

• 作者:Peter O'Hanlon •Silverlight 支持:是

• 文档:库中提供的示例应用程序

• 托管:CodePlex

• 许可证:MS-PL

• 特点:

  1. “工作区”管理(可关闭的文档集)

  2. 皮肤支持

  3. VM 之间的消息传递

【讨论】:

  • 很棒的帖子。只是想我会补充一点,Cinch 版本 2 确实支持 Silverlight。
【解决方案3】:

我尝试描述 Pete 的出色答案中缺少的框架:

MVVM Toolkit (Microsoft) 是一个非常轻量级的库,带有 Visual Studio 项目模板,应该支持初学者使用这种模式。如果 Microsoft 的 Toolkit 获得了良好的反馈,那么他们可能会将其作为新的 Visual Studio(可能是 2010 年)项目模板来实现。

Prism (Microsoft p&p) 是一个框架,它提供的不仅仅是对 MVVM 模式的支持。该项目的主要目标是帮助您构建模块化 WPF 和/或 Silverlight 应用程序。当你只需要实现 MVVM 模式或者你是 .NET/WPF 的初学者时,我不会推荐这个项目。 另见:Link

WPF Application Framework (WAF) 是一个轻量级框架,可帮助您使用 MVVM 创建 WPF 应用程序。它仅适用于 WPF,因此不支持 Silverlight。随着 Controllers 的引入,它与大多数其他 MVVM 框架相比有所不同。他们负责应用程序工作流,并在各种 ViewModel 之间进行调解。

【讨论】:

    【解决方案4】:

    嗯。 Mvvm 并不需要一个完整的框架来支持 IMO。如果您理解这个概念,那么从一个实现 INotify 的干净 VM 基类开始非常简单,然后从那里开始。

    【讨论】:

    • 很多开发者开发mvvm库是有原因的。如果你说的是真的,那这些开发者为什么要浪费他们的时间呢?为什么这些框架用户会继续使用他们最喜欢的 mvvm 框架?没错,“Mvvm 并不真正需要整个框架来支持 IMO”。但是没有 MVVM 框架是不切实际的。
    • -1 IMO 为 ICommands 编写您自己的 RelayCommand 类、用于 VM 间通信的 Messenger 类和您自己的 IoC 容器(仅提及运行良好的 WPF 应用程序所需的最基本工具)是一个主要的皮塔饼。您的答案仅对最简单的程序有效。
    【解决方案5】:

    另请看:

    Caliburn & Onyx!

    【讨论】:

      【解决方案6】:

      混合你自己的!

      我使用了 PRISM 的 EventAggregator,以及 MVVM 基金会的 ViewModelBase 等等。我还调整了 RelayCommand(在某些地方调用了 DelegateCommand)以接受其他数据,等等。

      我不会只推荐一个框架本身。

      【讨论】:

      • 我非常不同意,这种方法的问题会在你获得新加入者时暴露出来——项目的进入成本会高得多,因为内部文档通常不是优先考虑的。
      • 我可以看到有关文档的要点。但是可能不需要开发内部文档。带有文档的外部站点的链接可以嵌入到代码本身中
      【解决方案7】:

      我的赌注将放在 Caliburn 和 MVVMlight 上,似乎这些 mvvm 框架中没有多少支持 silverlight。我可以预见,相比 IoC 框架,将有更多的 MVVM 框架可供选择,因为很难为 mvvm 框架设置功能边界。我想找出哪个更适合您的项目的最佳方法是列出/比较它们的功能。

      还可以查看 Mix10。我从演讲中学到了很多东西:构建你的 mvvm 框架。

      【讨论】:

      【解决方案8】:

      还有 Ideablade 的 Cocktail 和 DevForce 框架

      【讨论】:

        【解决方案9】:

        我正在使用 Prism 并且喜欢它。对我来说最重要的事情之一是,如果需要的话,会有其他人可以帮助我,并且有很好的例子。一旦您掌握了基础知识,您的应用程序将需要大量扩展,而当您使用与其他人相同的框架时,它会变得容易得多。

        【讨论】:

          【解决方案10】:

          总而言之,我的应用程序完成了 90%,我使用的 MVVM Toolkit 是工厂函数,它为我构建命令,给定委托函数以在 Execute 中启动。 我想我可以在几个小时内切换到任何其他框架或没有框架。

          【讨论】:

            【解决方案11】:

            另一个需要考虑的是MEFedMVVM。我在几个项目中使用过它,它是轻量级的、非侵入式的,并且支持 Silverlight 和 WPF。对于使用该产品的用户,它还能够支持 Blend 中的设计时数据。

            【讨论】:

              【解决方案12】:

              如果您正在 WPF/MVVM 应用程序框架之上寻找可扩展性(编写插件的能力),那么您可能对 SoapBox Core 感兴趣 免责声明:我写的 .它是开源的,所以即使你不使用它,也可能有一些对你有用的好主意。它使用 MEF 来实现可扩展性和 IoC。

              【讨论】:

                【解决方案13】:

                还有nRoute

                一个非常好的 WPF/Silverlight 应用程序框架,支持 MVVM

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2023-03-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-04-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-12-04
                  相关资源
                  最近更新 更多