我应该使用什么MVVM框架?
我正在开发一个MVVM模型的应用程序,但是我已经达到了需要select使用哪个框架的地步。
可能的选项包括:
- MVVM工具包
- MVVM基金会
- WPF应用程序框架(WAF)
- 轻MVVM
- 卡利
- 肚带
- 棱镜
在你的经验,哪个更好?
这实际上取决于你想要达到的目标,你想要的基础设施到底有多less,再加上你可以很容易find帮助你的样本。 我要在这里宣布一个兴趣,因为我已经积极参与了至less一个MVVM框架,并且通过WPF门徒小组已经有了他人的投入,所以我有点偏见。 说,这里是:
微软的MVVM工具包 – 这仍然是在阿尔法阶段。 当它最初被释放的时候,它从门徒那里得到了一点,因为它没有做什么。 说,MS正在寻找这个框架,所以它是一个看 – 它还没有准备好。
MVVM基金会 – 啊乔什史密斯的框架版本。 Josh是MVVM的老爹之一,一直是这个模式的一个巨大的倡导者和老师。 结果,你会在其他框架中发现很多Josh的指纹。 这个框架旨在提供MVVM的基础知识,而不是解决一些更深奥的问题。 最初这只是为了WPF,但像Laurent Bugnion和我这样的人已经添加了function/项目,这也意味着这将是一个兼容Silverlight的框架。
WAF–没有经验,所以我不敢评论它。
MVVM Light – Laurent Bugnion采取了它,并且刚刚更新到版本2.这是一个非常好的框架,但是它也不打算涵盖MVVM应用程序的每个方面。 鉴于Laurent的背景,它具有非常强大的Silverlight和Blendability支持。
更新 Laurent刚刚告诉我,.NET 3.5和.NET 4.0版本是function兼容的。 瓦洛去洛朗。
Cinch – Sacha Barber出色的WPF MVVM框架。 这比我上面讨论的框架涵盖的更多。 这是一个很好的框架,并利用比尔·肯普夫优秀的Onyx项目所涵盖的概念。 Onyx旨在补充MVVM框架,并增加了人们在MVVM / WPF中通常很难做到的function。 再次,原本打算只是WPF,Onyx已经进步到包括SL兼容性 – 我特别感到自豪的参与。
棱镜 – 再次,我从来没有使用过,但我听到了很多关于它的好东西。
海洋 – Cider团队项目经理Karl Shifflett最近发布了一个全function的WPF MVVM框架。 再次,这是一个很好的框架,有很多推荐它。
底线是,下载不同的框架,看看他们,并找出哪一个最符合你的想法和你的要求直观。 如果您认为您可能希望从相同的代码库中支持Silverlight,那么仅限WPF框架应该被打折扣。
我发现这篇文章非常有用http://www.japf.fr/2009/10/a-quick-tour-of-existing-mvvm-frameworks/为了让我把它带到即将到来的用户;
我更新了Cinch部分并为其function添加了Silverlight支持
我为这个漫长的故事感到抱歉
共同特征:
•ViewModelBase类(用于实现INotifyPropertyChanged接口)
•RelayCommand类,将UI命令链接到ViewModel的处理程序
•unit testing随框架一起提供
肚带
•作者:Sacha Barber
•Silverlight支持:否(Cinch版本2支持Silverlight)
•文档:出色的,在CodeProject上发表的6篇文章
•托pipe:CodePlex
•许可证:代码项目开放许可证
• 特征:
附加的行为
使用IDataErrorInfo进行validation
支持IEditableObject
弱事件创build和订阅
使用弱事件的中介信息
IOC / DI支持(使用Unity)
服务:事件logging器,消息框,打开保存对话框,popup
线程助手
支持菜单项
可closures的viewmodels
MVVM代码生成器
MVVM轻工具包
•作者:Laurent Bugnion
•Silverlight支持:是的
•文档:在Laurent的博客+其他开发人员也可以find许多文章
•托pipe:CodePlex
许可证:MIT许可证
• 特征:
MSI安装程序
VS项目和项目模板
VS代码片段
用于视图间模型通信的Messenger系统
MVVM助手
•作者:Mark Smith
•Silverlight支持:否
•文档:Mark的博客上的一些文章
•托pipe:个人网站
•许可证:未定义
• 特征:
附加的行为
使用标记扩展创buildviewmodel
基于属性的validation
IOC / DI使用ServiceProvider方法
可closures的viewmodel
等待光标(使用新的WaitCursor(){//你的代码在这里})
MVVM基金会
•作者:Josh Smith
•Silverlight支持:否
•文档:关于Josh或Marlon Grech博客上的Messenger实现的文章
•托pipe:CodePlex
•许可证:MS-PL
• 特征:
用于视图间模型通信的Messenger系统
PropertyChanged事件监视器
卡利
•作者:Rob Eisenberg
•Silverlight支持:是的
•文档:提供完整的在线文档
•主机:CodePlex http://www.codeplex.com/caliburn
许可证:MIT许可证
• 特征:
命令构build在Actions之上,因此共享许多相同的function,包括多个input参数,filter和自动asynchronous执行
处理UI生命周期问题的演示者,例如处理各种UI组件的激活,停用和closures语义
Caliburn应用程序是完全可testing的
各种实用工具,如后台任务pipe理器
支持各种UI模式(不只是MVVM)
dependency injection容器
缟玛瑙
•作者:William e Kempf
•Silverlight支持:否
•文档:CodePlex上的基本介绍
•托pipe:CodePlex
•许可证:未指定
• 特征:
ServiceLocator模式
使用自定义标记扩展名创buildViewModel
UI相关的服务,如IDisplayMessage
钙
•作者:Daniel Vaughan
•Silverlight支持:否
•文档:关于CodeProject的2个非常详细的文章(第1部分和第2部分)
•托pipe:CodePlex
•许可:使用,复制,修改和/或分发和保留版权!
• 特征:
模块pipe理器,用于在运行时启用或禁用模块
消息传递服务,用于使用相同的API从客户端或服务器与用户进行交互
Command Service将WPF ICommands与仅在活动视图或视图模型实现接口时才变为活动状态的内容接口相关联
工具栏和菜单的区域适配器
客户端 – 服务器日志logging准备就绪即可使用
包括模块,如Web浏览器,文本编辑器,输出窗口,等等
带有脏文件指示的选项卡式界面(可跨模块重复使用)
nRoute
•作者:Rishi
•Silverlight支持:是的
•文档:作者博客上的许多文章(请参阅CodePlex项目主页的链接)
•托pipe:CodePlex
•许可证:MS-PL
• 特征:
支持Blend3行为和触发器模型
资源定位器框架
查看服务:OpenFileDialog,ShowMessage …
使用属性来将View和ViewModel映射在一起
Nito MVVM
•作者:沙玛
•Silverlight支持:否
•文件:没有
•托pipe:CodePlex
•许可证:未指定
• 特征:
- ICommand接口的各种MVVM友好的实现
海洋
•作者:Karl Shifflet
•Silverlight支持:否
•文档:可在Karl博客上find的文章
•托pipe:个人网站
•许可证:未指定
• 特征:
用VB.Net编写
基于属性的validation
viewmodel基类:relaycommand,closeableviewmodel …
SQL服务器数据访问层
基本的MVVM框架
•作者:Lester Lobo
•Silverlight支持:否
•文档:库中提供的示例应用程序
•托pipe:CodePlex
•许可证:MS-PL
• 特征:
委托Commands \ Keybinding
VM之间的消息传递
将事件作为附加行为的命令来处理
处理对话(和更多)作为服务
VS代码片段
GoodLight
•作者:Peter O'Hanlon•Silverlight支持:是的
•文档:库中提供的示例应用程序
•托pipe:CodePlex
•许可证:MS-PL
• 特征:
“工作区”pipe理(可以closures的文档集)
皮肤支持
VM之间的消息传递
我试图描述皮特伟大的答案中缺less的框架:
MVVM工具包(微软)是一个非常轻量级的库,Visual Studio项目模板应该支持这种模式的初学者。 如果微软对他们的工具包得到了很好的反馈,那么他们可能会把它作为一个新的Visual Studio(也许是2010)项目模板来实现。
Prism(Microsoft p&p)是一个比MVVM模式支持更多的框架。 这个项目的主要目标是帮助你build立模块化的 WPF和/或Silverlight应用程序。 当你只需要实现MVVM模式,或者你是.NET / WPF的初学者时,我不会推荐这个项目。 另请参阅: 链接 。
WPF应用程序框架(WAF)是一个轻量级框架,可以帮助您使用MVVM创buildWPF应用程序。 这只是为了WPF,所以它不支持Silverlight。 与引入控制器的大多数其他MVVM框架相比,它有点不同。 他们负责应用程序的工作stream程,并在各种ViewModel之间进行调解。
咩。 Mvvm并不需要整个框架来支持IMO。 如果你理解了这个概念,那么从一个实现INotify的干净的VM基类开始,直接从那里开始是非常简单的。
另请看:
Caliburn & Onyx !
混合你自己!
我使用PRISM的EventAggregator,MVVM基础的ViewModelBase等等。 我还调整了RelayCommand(在某些地方调用了DelegateCommand)以接受其他数据,等等。
我不会只推荐一个框架本身。
我敢打赌,Caliburn和MVVMlight似乎并不是很多这样的mvvm框架支持silverlight。 我可以预见,将会有更多的MVVM框架可供select,而不是IoC框架,因为设置mvvm框架的function边界更加困难。 我想最好的方法来找出哪一个更适合您的项目将通过列出/比较他们的function。
也检查出Mix10。 我从这个话题中学到了很多东西:构build你的mvvm框架。
还有Ideablade的Cocktail和DevForce框架
我使用棱镜,喜欢它。 对我来说最重要的事情之一就是,如果需要的话,还有其他人可以帮助我,例如。 一旦你掌握了基础知识,就会有一大堆你需要用于你的应用程序的扩展,当你使用与其他应用程序相同的框架时,它会变得更加容易。
总而言之,通过我的应用程序,我达到了90%,所有我使用过的MVVM Toolkit都是工厂函数,它为我提供了一个在Execute中启动的委托函数。 我想我可以在几个小时之内切换到任何其他框架或者没有框架。
另一个要考虑的是MEFedMVVM 。 我已经在一些项目上使用它,它是轻量级的,非侵入性的,支持Silverlight和WPF。 它也能够支持Blend中的devise时数据,供那些使用该产品的人使用。
如果您想在WPF / MVVM应用程序框架之上寻找Extensibility(编写加载项的能力),那么您可能对SoapBox Core 免责声明感兴趣:我写了它 。 它是开源的,所以即使你不使用它,那里可能会有一些好的想法给你。 它将MEF用于扩展性和IoC。
还有nRoute
支持MVVM的WPF / Silverlight非常好的应用程序框架