有没有比使用MVVM的静态类或单例更好的方法?

时间:2013-06-04 18:58:59

标签: c# wpf mvvm

我发现在很多情况下,似乎(至少表面上看)在我的WPF-MVVM应用程序中使用Singletons或Static类用于模型是有意义的。大多数情况下,这是因为我的大多数模型都需要在整个应用程序中访问。制作我的模型static是一种满足此要求的简单方法。

然而,我之间存在冲突,因为地球上的每个人似乎都讨厌单身人士。所以我想知道我没有更好的方法,或者我做的事情显然是错的?

3 个答案:

答案 0 :(得分:5)

单身人士有几个问题。我将在下面概述它们,然后提出一些替代解决方案。我不是一个“永远不会使用单身人士,或者你是一个垃圾编码器”的人,因为我相信他们确实有自己的用途。但这些用途很少见。

  1. 线程安全。如果你有一个全局静态的Singleton,那么它必须是线程安全的,因为任何东西都可以随时访问它。这是额外的开销。

  2. Singletons的单元测试更加困难。

  3. 它是全局变量的廉价替代品(我的意思是,这就是单身人士在一天结束时的情况,尽管它可能有方法和其他奇特的东西)。

  4. 请注意,并不是说辛格尔顿本身就是“可怕的可憎之物”,而是它是许多新程序员要处理的第一个设计模式,它的“便利性”模糊了它的“陷阱”(只需在其上加上一些齿轮并称之为蒸汽朋克)。

    在您的情况下,您指的是模型,它们总是“实例”,因为它们自然地反映了数据。也许您担心获得这些实例的成本。相信我,它们应该可以忽略不计(显然是数据访问设计)。

    那么,替代品呢?将模型传递到需要它的位置。这使得单元测试更容易,并允许您以心跳方式更换该模型的基础知识。这也意味着您可能希望查看接口 - 这些表示合同。然后,您可以创建实现这些接口的具体对象 - 您的代码很容易进行单元测试,并且可以修改。

    在单身世界中,对该单例的单一更改可能从根本上破坏代码库中的所有内容。不是一件好事。

答案 1 :(得分:2)

我认为这个问题的公认解决方案是使用依赖注入。通过依赖注入,您可以将模型定义为常规非静态类,然后让控件容器的反转在您需要时“注入”模型的实例。

wpftutorial.net上有一个很好的教程,展示了如何在WPF中进行依赖注入:http://wpftutorial.net/ReferenceArchitecture.html

答案 2 :(得分:2)

我使用的唯一静态类是MessageBroker,因为我需要在整个应用程序中使用相同的实例。

但即使这样,也很有可能使用Unity(或其他依赖注入/容器)来管理您只需要其中一个类的实例。

这允许您在需要时注入不同的版本(例如在单元测试期间)

BTW:静态与单身不同。但我不是在这里进入。只需搜索stackoverflow就可以获得更多有趣的问题:)