请帮助 - 我迷路了!
我正在编写一个小型桌面应用程序,它有一些控件和一些屏幕。这应该稍后与一个小网站集成,也有一些屏幕。我们的想法是让用户编辑视频并选择图像,然后与朋友分享他们的结果。
桌面应用程序正在使用C#WPF,即网站 - ASP.Net MVC。
我读到使用MVVM可以更轻松地将应用程序增加到几个屏幕。所以我开始搜索并发现了Caliburn.Micro和MVVM.Light。我已经下载了一些教程,但正如我准备深入研究材料一样,我找到了here on S.O。还有Prism,MEF,Unity,ReactiveUI - 这太过分了!
我学习新东西很糟糕 - 我花了很多时间学习WPF和ASP.Net MVC。我不想研究很多新材料,只是为了稍后发现它不相关。而且我没有一位建筑师来指导我。
所以我的问题是:你能否对这些框架和技术进行透视,并建议我应该把重点放在研究和使用上(特别是后来用于Windows 8的内容)?
答案 0 :(得分:42)
如果你想构建一个MVVM应用程序(你可能会为了各种优势而做),那么you want an MVVM framework。
我建议Caliburn.Micro,因为它可以直接按照Caliburn.Micro文档页面上的示例实现。它对配置机制也有一个非常引人注目的约定,并使用Actions系统从视图中调用视图模型上的动词(方法)。这比我见过的任何其他机制都更强大。
Prism是一个非常重量级的框架,其中包含MVVM设计的元素以帮助实现,以及特别适合构建复合应用程序(由托管shell中的分离组件构建的应用程序)。
MEF对于需要发现应用程序的插件或扩展(甚至在应用程序已经引导之后)的这些类型的应用程序非常有用,并且可以与诸如Caliburn.Micro之类的MVVM框架一起使用。 MEF也可用于实现控制反转,但不提供控制容器的其他反转中的一些核心功能,因此您可能决定仅使用它来实现插件功能。
Unity是一个IoC容器,可用于为您的常规应用程序基础结构实现依赖项注入。 .NET空间中有许多IoC容器,其中一些容器提供了改进的性能,附加功能或更友好的API。
我不知道ReactiveUI,因为我没有使用它。
如果您正在谈论最大化代码重用以转移到WinRT,那么MVVM is a great choice。
答案 1 :(得分:15)
PRISM已包含MEF和MVVM逻辑:)
这里有一点点解释:
MVVM代表您应用程序中的逻辑。实际上是View,View-Model和Model解耦的巧妙方式。不知道任何最好的(?)框架 - 你可以检查Catel,如果你想要或MVVM Light,但它只是来自了解MVVM逻辑的人的大量代码,只是让它变得简单实现它。你实际上可以尝试编写自己的MVVM框架并看到“没有秘密成分” - 只是相同的重复代码和相同的类等等......实际上你不需要任何MVVM框架实现MVVM。
一旦你学习并编写MVVM,你就会立即遇到问题 - 我如何以解耦的方式测试它(例如,这在Silverlight中不是一个小问题) - 所以这里所有的IOC / Inject框架都会发挥作用。例如MEF。请考虑以下示例来了解有关Inject框架的大图:
项目'共享',用'最小分隔符'(例如可移植库)
编写 public interface IAmSharedInterface
{
string SayHello();
}
项目“主要”,仅参考“共享”项目
public class IAmMainClass
{
[ImportingConstructor]
public IAmMainClass(IAmSharedInterface SharedInterface)
{
SharedInterface.SayHello();
}
}
项目'执行者',仅参考'共享'项目
[Export(IAmSharedInterface)]
public class IAmImplementor: IAmSharedInterface
{
public string SayHello()
{
return "Hello from implementator class to whoever using it";
}
}
你知道 - 'Main'和'Implementator'项目之间没有直接的引用 - 所有'魔术'都发生在MEF / Unity构建/解析过程中。因此,您可以轻松地在Main上运行NUnit测试,而不使用“Implementor”项目和“Implementor”与“Main”。还有一个场景,其他项目可以实现和导出'IAmSharedInterface'专门用于测试目的。
回到PRISM - 它有所有(!)这个。我知道不容易框架立即理解,不适合简单的'Hello World'程序但是一旦你学会了它 - 就没有办法了。它只是将所有部分粘合在一起,并为您提供使用任何moq框架的大量自由(例如Rhino)。
Prism在微软发展,所以(我希望)不仅在Windows 8中支持,在Windows 9和所有未来版本中都支持它。
无论你问什么内部:MVVM,注入,分离/插件,易于阅读和测试
答案 2 :(得分:11)
为了节省上述详细信息,我将努力为您提供便利。
1)现在,忘记IOC /依赖注入/插件架构。你说你正在创建一个简单的应用程序,所以暂时忘记这个。保持你的代码整洁,你可以在必要时实现它(这是好东西)。
2)在你列出的框架中,我建议使用Caliburn.Micro。它相对简单,轻巧。启动并运行不会花费很长时间。
3)在单独的程序集中创建模型,您可以将其用于Windows应用程序和MVC网站。
保持简单,不要陷入所有技术的困境。
答案 3 :(得分:0)
此答案再现了Rockford Lhotka's Blog article "Using the MVVM pattern requires a framework"的一些节略in another answer。
这是该问题的元答案(尽管它确实包含特定的建议),但是首先解释框架在MVVM中的作用似乎很有用。
三个公平 我统称为流行的表示层设计模式 “ M”模式:MVC,MVP和MVVM。这是因为他们都有一个 “ M”代表“模型”,以及其他一些构造。
具有所有这些“ M”模式的东西是典型的 开发人员如果没有框架,模式将毫无用处。使用 没有框架的模式几乎总是会引起混乱, 并发症,高昂的成本,沮丧和最终的绝望。
毕竟,这些仅仅是模式,而不是实现。他们是 大而复杂的模式,其中包含许多必须起作用的概念 正确地合作以取得成功。
...
在没有框架的情况下尝试进行类似MVVM的操作非常麻烦 工作。大量重复代码,重新发明轮子和重新培训 人们有不同的想法。
至少使用框架可以避免重复代码,并希望 不必重新发明轮子-让您专注于再培训 人。培训部分通常是不可避免的,但是需要一个框架 提供管道代码和结构,使过程更容易。
您可能会问自己,为什么MVC模式仅在 几年前的ASP.NET ...
奇怪的是,MVC才开始成为Microsoft的主流 ASP.NET MVC出现时的世界。这是一个全面的框架 工具集成到Visual Studio中。结果是。典型 开发人员只能构建模型,视图和控制器。之前 到那时,他们还必须构建MVC框架所做的一切- 这是很多代码。不仅是很多代码,还有 绝对与业务价值无关,仅与 模式本身的实现。
...
典型的开发人员确实希望专注于构建模型,视图, 和视图模型。他们不想建立基于弱参考的 事件路由器,导航模型,视图抽象以及所有其他 框架必须做的事情。
...
与此同时,Caliburn Micro似乎是最好的MVVM框架 在那里-当然是使用最广泛的[截至2012年] ...
(出于保留原因,内联复制了文本。)