34

请帮忙 - 我迷路了!

我正在编写一个具有一些控件和一些屏幕的小型桌面应用程序。这应该稍后与一个小型网站集成,也有一些屏幕。这个想法是让用户编辑视频并选择图像,然后与她的朋友分享他们的结果。

桌面应用程序使用 C# WPF,网站 - ASP.Net MVC。

我读到使用 MVVM 将应用程序扩展到几个屏幕会更容易。所以我开始搜索并发现了 Caliburn.Micro 和 MVVM.Light。我已经下载了一些教程,但是,就在我准备深入研究材料时,我在 SO 上找到了。还有 Prism、MEF、Unity、ReactiveUI - 这变得太多了!

我不擅长学习新事物——学习 WPF 和 ASP.Net MVC 花了我很长时间。我不想研究很多新材料,后来才发现它不相关。而且我没有建筑师来指导我。

所以我的问题是:您能否正确看待这些框架和技术,并建议我应该重点研究和使用哪些(尤其是以后可以与 Windows 8 一起使用的)?

4

4 回答 4

47

如果您想构建一个 MVVM 应用程序(您可能会因为各种优势而这样做),那么您需要一个 MVVM 框架

我会推荐Caliburn.Micro,因为它很容易按照 Caliburn.Micro 文档页面上的示例来实现。它还有一个非常引人注目的配置机制约定,并使用Actions系统从视图中调用视图模型上的动词(方法)。这比我见过的任何其他机制都更强大。

Prism 是一个相当重量级的框架,其中包括 MVVM 设计元素以帮助实现,并且特别针对构建复合应用程序(由托管外壳中的解耦组件构建的应用程序)进行定制。

MEF 对于需要发现应用程序的插件或扩展的这些类型的应用程序非常有用(即使在应用程序已引导之后),并且可以与 MVVM 框架(例如 Caliburn.Micro)一起使用。MEF 也可用于实现控制反转,但不提供其他控制反转容器中的一些核心功能,因此您可能决定仅使用它来实现插件功能。

Unity 是一个 IoC 容器,可用于为您的通用应用程序基础架构实现依赖注入。不过,.NET 空间中有很多 IoC 容器,其中一些提供了改进的性能、附加功能或更友好的 API。

我不知道 ReactiveUI,因为我没有使用它。

如果您正在谈论最大限度地重用代码以迁移到 WinRT,那么MVVM 是一个不错的选择

于 2012-05-29T18:36:50.567 回答
15

PRISM 已经包含 MEF 和 MVVM 逻辑 :)

好的,这里有一点解释:

MVVM 代表应用程序中的逻辑。实际上是 View、View-Model 和 Model 解耦的巧妙方法。不知道有什么最好的(?)框架来做到这一点 - 如果需要,您可以检查CatelMVVM Light,但它只是来自了解 MVVM 逻辑并使其易于实现的人的大量代码。您实际上可以尝试编写自己的 MVVM 框架并看到“没有秘密成分” - 只是相同的重复代码和相同的类等......实际上您不需要任何 MVVM 框架来实现 MVVM。

一旦你学习并编写了 MVVM,你就会立即遇到问题——我如何以解耦的方式进行 NUnit 测试(例如,这在 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";
       }
    }

你看 - “主要”和“实施者”项目之间没有直接引用 - 所有“魔法”都发生在 MEF/Unity 构建/解决过程中。因此,您可以轻松地在 Main 上运行 NUnit 测试,而无需使用“Implementor”项目和“Implementor”和“Main”。还有一种情况是其他项目可以专门为测试目的实现和导出“IAmSharedInterface”。

所以回到 PRISM - 它拥有所有(!)这个。我知道这不是一个容易理解的框架,它适合简单的“Hello World”程序,但是一旦你学会了它——就没有回头路了。它只是将所有部分粘合在一起,让您在使用任何您想要的最小起订量框架(例如Rhino)时有很大的自由度。

Prism 在 Microsoft 中开发,因此(我希望)它不仅会在 Windows 8 中得到支持,而且会在 Windows 9 和所有未来版本中得到支持。

无论你问什么,它都在里面:MVVM、注入、解耦/插件,易于阅读和测试

于 2012-05-31T09:18:10.237 回答
13

为了节省添加到上面的详细信息,我将尝试让您的生活更轻松。

1) 现在,忘记 IOC / 依赖注入 / 插件架构。你说你正在创建一个简单的应用程序,所以暂时忘记这个。保持代码整洁,如有必要,您可以稍后实现(这是好东西)。

2) 在您列出的框架中,我建议使用 Caliburn.Micro。它相对简单且轻巧。启动和运行不会花很长时间。

3) 在单独的程序集中创建模型,您可以将其用于 Windows 应用程序和 MVC 网站。

保持简单,不要陷入所有技术的困境。

于 2012-07-02T08:23:13.730 回答
0

此答案复制了Rockford Lhotka 的博客文章“使用 MVVM 模式需要一个框架的一些删节块,该文章在另一个答案中被引用。

这是对这个问题的一种元回答(尽管它确实包含一个具体的建议),但首先解释框架在 MVVM 中的作用似乎非常有用。

有三种相当流行的表示层设计模式,我统称为“M”模式:MVC、MVP 和 MVVM。这是因为它们都有一个代表“模型”的“M”,以及一些其他结构。

所有这些“M”模式的问题在于,对于典型的开发人员来说,如果没有框架,这些模式将毫无用处。在没有框架的情况下使用模式几乎总是会导致混乱、复杂化、高成本、沮丧和最终绝望。

毕竟这些只是模式,而不是实现。它们是大而复杂的模式,其中包含许多必须正确协同工作才能取得成功的概念。

...

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

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

您可能会问自己,为什么 MVC 模式只是在几年前才在 ASP.NET 中流行起来......

奇怪的是,当 ASP.NET MVC 出现时,MVC 才开始成为微软世界的主流。这是一个综合框架,工具集成到 Visual Studio 中。因此。典型的开发人员可以只构建模型、视图和控制器。在此之前,他们还必须构建 MVC 框架所做的一切——这需要大量代码。而且不仅仅是很多代码,而是与业务价值完全无关的代码,只与模式本身的实现有关。

...

典型的开发人员确实希望专注于构建模型、视图和视图模型。他们不想构建基于弱引用的事件路由器、导航模型、视图抽象以及框架必须做的所有其他事情。

...

与此同时,Caliburn Micro似乎是目前最好的 MVVM 框架——当然是使用最广泛的 [截至 2012 年]...

(出于保存原因,内嵌文本复制。)

于 2018-08-20T16:09:08.380 回答