MVVM,Unity,Prism,MEF,Caliburn - 我应该使用什么?

时间:2012-05-29 12:24:51

标签: prism unity-container mef mvvm-light caliburn.micro

请帮助 - 我迷路了!

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

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

我读到使用MVVM可以更轻松地将应用程序增加到几个屏幕。所以我开始搜索并发现了Caliburn.Micro和MVVM.Light。我已经下载了一些教程,但正如我准备深入研究材料一样,我找到了here on S.O。还有Prism,MEF,Unity,ReactiveUI - 这太过分了!

我学习新东西很糟糕 - 我花了很多时间学习WPF和ASP.Net MVC。我不想研究很多新材料,只是为了稍后发现它不相关。而且我没有一位建筑师来指导我。

所以我的问题是:你能否对这些框架和技术进行透视,并建议我应该把重点放在研究和使用上(特别是后来用于Windows 8的内容)?

4 个答案:

答案 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年] ...

(出于保留原因,内联复制了文本。)