我应该使用哪种MVVM框架?[关闭]


233

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

可能的选项包括:

  • MVVM工具包
  • MVVM基础
  • WPF应用程序框架(WAF)
  • 轻型MVVM
  • 卡利本
  • 肚带
  • 棱镜
  • 反应式UI

以您的经验,哪个更好?


14
+1-好问题,但请说明“更好”。不同的框架提供不同的优势,最好取决于您的要求。期待答案:)
罗素

很好,可以与WPF和Silverlight一起使用,并且学习曲线最少。
Rangel

2
您可能也想看看Caliburn。codeplex.com/caliburn
Kent Boogaart,2009年

抱歉,肯特。我怎么会忘记卡利本?
Pete OHanlon 09年

2
封闭,古老,但是...由于需要组件支持,因此我使用Prism(第一个问题)做了我的第一个项目。我的上一个项目是原始的-根本没有框架。您只需要一个命令类,就可以在没有框架的情况下进行MVVM-所获得的重量很轻。
dave 2014年

Answers:


194

这实际上取决于您要实现的目标以及要建立多少基础架构,以及找到有助于您的样本的难易程度。我将在这里声明一个兴趣,因为我一直积极参与至少一个MVVM框架,并且我已经通过WPF Disciples组向其他人提供了意见,所以我有些偏颇。这样说,这里是:

Microsoft的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中难以完成的功能。同样,Onyx原本仅打算用作WPF,但现在已发展为包括SL兼容性-我参与其中的工作让我感到特别自豪。

Prism-再说一次,我从未使用过它,但是我听到了很多关于它的好东西。

海洋 -苹果酒团队的项目经理Karl Shifflett最近发布了功能齐全的WPF MVVM框架。同样,这是一个出色的框架,值得推荐。

最重要的是,下载不同的框架,看看它们,然后找出最直观地适合您的思维方式和需求的框架。如果您认为可能希望从相同的代码库中支持Silverlight,则应仅使用WPF框架。


4
我使用我们写的一个,因为我们对MVVM有非常专业的需求。这在很大程度上受到Josh所做工作的影响,并且我将在不久的将来将其作为开源发布(我正忙于剥离专有位)。叫做Goldlight。
Pete OHanlon 09年

除此之外,您的数据访问层框架是什么?伙计们.. LINQ,LLBLGen,EF,nHibernate?
Jirapong

这取决于项目和要求。有时我们使用LINQ,有时使用NHibernate,有时使用Castle ActiveRecord,有时使用eXpress Persistent Objects。
皮特·OHanlon,09年

3
嗨,Pete,您只想评论一下MVVM Light Toolkit对于WPF 3.5和WPF 4的工作原理与对于Silverlight 3和Silverlight 4的工作原理是相同的。你说得对有关混合能力虽然,这对我来说是一个主要问题:)干杯,洛朗
LBugnion

1
令我失望的是MVVM Toolkit尚未更新为可与Visual Studio 2010一起使用。可能要将其添加到决策过程中。我认识的大多数人在2010年内使用MVVM模板时,都在使用MVVM Light,仅出于这个原因,一些人迁移到了MVVM Light。
ScottCher 2011年

54

我发现这篇文章非常有用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 Light工具包

•作者:Laurent Bugnion

•Silverlight支持:是

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

•托管:CodePlex

•许可证:MIT许可证

• 特征:

  1. MSI安装程序

  2. VS项目和项目模板

  3. VS代码段

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

  5. 将事件作为命令处理

MVVM助手

•作者:马克·史密斯

•Silverlight支持:否

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

•托管:个人网站

•许可证:未定义

• 特征:

  1. 依附行为

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

  3. 基于属性的验证

  4. 使用ServiceProvider方法的IOC / DI

  5. 可关闭的视图模型

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

MVVM基础

•作者:乔什·史密斯(Josh Smith)

•Silverlight支持:否

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

•托管:CodePlex

•许可证:MS-PL

• 特征:

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

  2. PropertyChanged事件监视器

卡利本

•作者:罗伯·艾森伯格

•Silverlight支持:是

•文档:可用的完整在线文档

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

•许可证:MIT许可证

• 特征:

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

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

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

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

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

  6. 依赖注入容器

y玛瑙

•作者:William e Kempf

•Silverlight支持:否

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

•托管:CodePlex

•许可证:未指定

• 特征:

  1. ServiceLocator模式

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

  3. 与UI相关的服务,例如IDisplayMessage

•作者:丹尼尔·沃恩(Daniel Vaughan)

•Silverlight支持:否

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

•托管:CodePlex

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

• 特征:

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

  2. 消息传递服务,用于使用相同的API从客户端或服务器与用户进行交互

  3. 将WPF ICommands与内容接口相关联的命令服务,仅当活动视图或视图模型实现该接口时,该接口才处于活动状态

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

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

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

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

路线

•作者:Rishi

•Silverlight支持:是

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

•托管:CodePlex

•许可证:MS-PL

• 特征:

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

  2. 资源定位器框架

  3. 查看服务:OpenFileDialog,ShowMessage…

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

Nito MVVM

•作者:Shammah

•Silverlight支持:否

•文档:否

•托管:CodePlex

•许可证:未指定

• 特征:

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

海洋

•作者:卡尔·希夫莱特

•Silverlight支持:否

•文档:Karl博客上的文章

•托管:个人网站

•许可证:未指定

• 特征:

  1. 用VB.Net编写

  2. 基于属性的验证

  3. viewmodel基类:relaycommand,closeableviewmodel…

  4. SQL Server数据访问层

基本的MVVM框架

•作者:Lester Lobo

•Silverlight支持:否

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

•托管:CodePlex

•许可证:MS-PL

• 特征:

  1. 委托Command \ Keybinding

  2. VM之间的消息传递

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

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

  5. VS代码段

好光

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

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

•托管:CodePlex

•许可证:MS-PL

• 特征:

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

  2. 皮肤支持

  3. VM之间的消息传递


很棒的帖子。只是以为我会补充说Cinch版本2确实支持Silverlight。
Kildareflare 2011年

44

我试图描述皮特的好答案中缺少的框架:

MVVM Toolkit(Microsoft)是带有Visual Studio项目模板的非常轻量级的库,应使用此模式支持初学者。如果Microsoft对其工具包获得了很好的反馈,则他们可以将其实现为新的Visual Studio(也许是2010年)项目模板。

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

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


19

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


4
有很多开发人员开发mvvm库的原因。如果您说的是真的,那么为什么这些开发人员会浪费时间呢?为什么这些框架用户会继续使用自己喜欢的mvvm框架?的确,“ Mvvm并不需要一个完整的框架来支持IMO”。但是,如果没有MVVM框架,则不可行。
Syaiful Nizam Yahya 2013年

3
-1 IMO是主要的PITA,它为ICommands编写了自己的RelayCommand类,为VM之间的通信编写了Messenger类,还为IWC容器编写了自己的IoC容器,其中仅提及功能良好的WPF应用程序所需的最基本的工具。您的答案仅对最简单的程序有效。
Heliac


10

自己混合!

我使用了PRISM的EventAggregator,以及MVVM Foundation的ViewModelBase等。我还调整了RelayCommand(在某些地方调用了DelegateCommand)以也接受其他数据,依此类推。

我不会建议仅一个框架本身。


19
我非常不同意,这种方法的问题会在您找到新的加入者时就暴露出来-由于内部文档通常不是优先考虑的项目,因此进入该项目的成本会更高。
Florian Doyon

1
我可以看到有关文档的要点。但是可能不需要开发内部文档。可以在代码本身中嵌入到带有文档的外部站点的链接
Vasudevan Kannan,2013年

8

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

还要检查Mix10。我从这次演讲中学到了很多:构建您的mvvm框架。


4
我发现这个谈话很有用。这是直接链接:live.visitmix.com/MIX10/Sessions/EX15
anshul 2010年


4

我正在使用Prism并喜欢它。对我来说,重要的事情之一是,如果需要的话,会有其他人可以帮助我,并且是很好的榜样。一旦基础知识开始运行,您的应用程序将需要大量扩展,而在使用与其他框架相同的框架时,这将非常容易。


2

总的来说,我90%的应用程序都是我使用的,而我使用MVVM Toolkit的全部是工厂函数,在给定要在Execute中启动的委托函数的情况下,该函数为我构建命令。我想我可以在几个小时内切换到其他任何框架,也可以不使用任何框架。


2

另一个要考虑的是MEFedMVVM。我已经在几个项目中使用了它,它是轻量级的,非侵入性的,并且支持Silverlight和WPF。对于使用该产品的用户,它还可以在Blend中支持设计时数据。


1

如果您正在WPF / MVVM应用程序框架之上寻找可扩展性(编写插件的能力),那么您可能对SoapBox Core 免责声明感兴趣:我编写了它。它是开源的,因此即使您不使用它,也可能会有一些不错的主意。它同时将MEF用于可扩展性和IoC。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.