如何在给定的MVVM应用程序中选择不使用框架(Caliburn.Micro等)?


28

我曾经开始一个MVVM / WPF项目,该项目最终得以构建和部署,为此,我研究了很多Caliburn.Micro MVVM框架。事实是:我最终没有为此使用Caliburn.Micro,最终自己实现了一些MVVM概念(特别是ViewModelBaseand RoutedCommand类)。

现在,我按照相同的原则被分配到一个更大的项目:可以说,“单用户富客户端脱机桌面应用程序”,因此我决定使用Caliburn.Micro。这就是我的“问题”开始的地方。

我已经读过一篇著名的博客文章,其标题为“如果您正在使用MVVM,那么您需要一个框架”,即:

“在没有框架的情况下尝试进行诸如MVVM之类的工作是一项巨大的工作。大量重复的代码,重新发明轮子,并训练人们以不同的方式思考

至少在框架下,您可以避免重复的代码,并希望不必重新发明轮子,从而使您可以专注于对人员进行再培训。再培训部分通常是不可避免的,但是框架提供了管道代码和结构,使过程更容易。

我会同意一读,但是我在Caliburn.Micro(CM)实际应用中的实际经验是无知和迷失方向。也就是说,该框架根本没有使过程变得更容易,相反。阅读由罗布·艾森伯格相当(太)非正式文档中提供不断重复的例子,从旋绕提供的样品试图推断使用模式,他们完全间接的类和接口的关系,这里的东西似乎被设计为工作基础上除非您是一个经验丰富的天才,否则副作用似乎是人类不可能做到的(对不起,这只蚂蚁很抱歉,但我想您知道我的意思)。

更不用说任何上述琐碎的场景似乎都涉及IoC容器,这是我从未使用过的东西,并且似乎解决了我什没有的问题。我不想花更多的项目时间来学习这些东西,而不必考虑我的问题和应用程序领域。我只想要一个香蕉,但CM给了我一个拿着一篮香蕉的大猩猩(IoC)。

现在,我正在考虑回到我自己家乡的MVVM框架-仅由我实际上要实现的少数特定于MVVM的类组成-我想至少给CM一个机会,以防万一我在这里丢失了一些东西,或者只是出于纯粹的经验和愚昧无知地“错误地”做事。所以问题是:

人们普遍认为“框架使事情变得更加轻松自然”,但是如果碰巧相反,这是否意味着我不应该使用该框架,或者我试图以错误的方式学习它?有没有一个线索,我什至不应该使用框架?还是有一些“正确”的方法来弄清楚如何将CM用于简单的MVVM开发?


1
我个人从每个框架中选择项目以用于特定行为,而我忽略了其余部分。例如,我喜欢使用Microsoft PRISM EventAggregator进行消息传递,NotificationObject使用ViewModelBase和使用MVVM Light RelayCommand进行命令。重要的是要确定框架将为您解决哪些问题,并仅使用这些解决方案。不要觉得您被迫使用整个框架库。
雷切尔(Rachel)2015年

@Rachel我打算将这种方法与Caliburn.Micro一起使用,但是找不到RelayCommand实现(因为它按照约定直接“绑定”到方法,而不是绑定到ICommand属性)。
heltonbiker

我从未使用过Caliburn框架,因为我不喜欢将View与Model / ViewModel层绑定的紧密程度。在您的情况下,RelayCommand如果Caliburn Micro 使用的库不适合您,我看不出您无法使用其他库中的任何原因。
雷切尔(Rachel)

@Rachel关于“ [caliburn]将视图与MVM层联系的紧密程度”,这是什么意思?以更好,更MVMV的方式将这些层捆绑在一起的“非caliburn”方式是什么?(我诚恳地问,因为我目前不知道)。
heltonbiker

老实说,我从未使用过Caliburn Micro,所以我觉得我对框架不满意。我记得给人的印象是View是首先创建的,并且负责确定代码隐藏对象,这是我不喜欢的一个方面,因为我不喜欢View-First开发。另一个是依赖于如何命名XAML组件的自动绑定,因为我认为它过多地将UI绑定到业务层。我听说过有关该框架的好消息,并且仅根据我的看法就不会建议避免使用它。自己尝试一下,看看是否喜欢它:)
Rachel

Answers:


16

我已经尝试过CaliburnMicro和MVVMLight,当使用Caliburn时,我真的感觉到您的感觉,请确保使用Name =“ PropertyName”而不是旧的Text =“ {Bind PropertyName}”将控件绑定到属性确实很神奇,但是在最终,卡利本(Caliburn)走出局面去做一件神奇的事情,当一件事情出了问题时,真的很难调试,更糟的是,他们有很多方法可以做一件事情。

但是,当使用MVVMLight时,它很薄,当您使用它时,您可能会意识到它几乎100%就像您的MVVM Framework一样,并散布了一些功能。

我知道这不能回答您的问题“如何不使用框架”,但坦率地说,我不建议您走那条路,因为那是错误的,我也认为您迷路了,因为您使用的是全功能框架而不是简单的框架。一个第一。


那么,您是否认为我至少应该尝试将MVVMLight用作“ Caliburn.Micro迷失方向”中的某种“治愈方法”?我一定会看看是否是这种情况。
heltonbiker

@heltonbiker当然,放手。它要简单得多,至少可以使您在MVVM Framework上立足。
kirie

我同意,发生了太多的魔术。我假设来自交流和组装背景。E由于背景中的魔力,某些东西只会发现它是行不通的。不可能进行调试,并且当您遇到性能问题时,通常无法做很多事情。
轧辊

10

重要的是要了解什么是MVVM。它不是您不必重新实现的某些共享功能(解析JPEG文件或连接到给定的SQL数据库服务器),而是一种模式-一种可以选择如何实现丰富的GUI的模式。因此,如果您对模式的实现既简单又直接,那么我认为使用该模式而不是使用框架无需感到羞耻。

的确,我相信整个“框架模式”思想已经太过分了。要使任何事物成为模式,它都必须是一类解决方案的总体形状。因为是这样,所以可以预期,模式将需要针对使用它们的系统进行定制,并且如果尝试使用一种一刀切的全能模式,则无法做到这一点。将模式实现留给应用程序设计者并提供封装功能而不是体系结构的库,将更具建设性。


2
除此之外,微软提供的MVVM(现成的WPF)也非常缺乏。即使对于将自己(正确的话)视为经验丰富的开发人员的程序员来说,也非常令人沮丧。魔术字符串,运行时模糊的异常,大多数基本内容(例如将一组单选按钮绑定到枚举)看起来像stackoverflow.com/q/397556/168719-框架可以做什么?他们必须呼应这种复杂性,或者试图对其提供真正浓厚的抽象
Konrad Morawski 2015年

2
@KonradMorawski WPF本身不是MVVM;您可以使用WPF编写代码,但这不是MVVM。因此,如果您想执行WPF和MVVM,则需要使用MVVM框架或自己实现。
安迪

1
@Andy当然的,但它肯定地说,WPF是打算用于MMVM。我指的是WPF内置的MVVM功能。我知道您仍然可以在后面进行编码
Konrad Morawski 2015年

@KonradMorawski您可以将WPF与MVVM一起使用,他们在牢记这种可能性的情况下就构建了WPF,但是WPF中没有内置MVVM特定功能。就像您可以将MVP与WinForms一起使用一样,但是WinForms并没有提供专门使用该模式的任何功能,具体取决于您。
安迪

3
@Andy也许我们现在正在争论定义。我的意思是,所有的“胶水”,这使得MVVM可能已经存在-在XAML,数据绑定DataContext等等
康拉德·莫拉夫斯基

7

我第一次使用WPF的经历是使用Caliburn.Micro,因此这与大多数开发人员可能大不相同。我发现WPF和Caliburn.Micro都是来自WinForms的相当陡峭的学习曲线,但是经过两者的一些经验,我发现它们很适合组合使用。目前,我在不使用Caliburn.Micro的其他组织中工作,但我确实发现有很多重复的管道代码,这使代码库变得肿且不必要地复杂。

我绝对同意,Caliburn.Micro可能有些麻烦,可能会使调试复杂化,但是一旦经历,它们再次痛苦的可能性就会大大降低。开发速度的提高,代码的更简洁和精简以及鼓励更好的MVVM的总体框架对我来说是值得的。

Caliburn.Micro也不会使股票WPF失效-它只是建立在其基础之上的,这意味着您仍然可以使用WPF功能,并且可以随意使用Caliburn。这类似于TypeScript和JavaScript在我心中共存的方式。

如果有机会,我绝对会在以后从事的任何新WPF项目中使用Caliburn.Micro。


3
感谢您的回答。两年后,在了解依赖注入容器的概念后,我发现更容易“接受”这些框架,这是我从马克·塞曼(Mark Seeman)的出色著作《 .NET中的DI》中学到的。
heltonbiker

1

对于因对Caliburn.Micro感到沮丧而来到这里的任何人,请查看以下框架: Stylet

它受Caliburn.Micro的启发,除了它消除了许多使您对正在发生的事情迷失了方向的魔术。此外,本文档以更普通的语言编写,而无需假设您想精通技术术语。对于初学者来说要好得多。

同样,Stylet采用ViewModel-First方法。Caliburn.Micro和许多其他框架都采用“视图优先”方法,该方法带有一些棘手的问题。如果您已经非常熟悉SOLID原理和模式代码,则很可能会发现ViewModel-First方法更为自然,因为它采用了逻辑应该驱动系统的观点,而不是视图。

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.