C# 对于MVVM,有没有比使用静态类或单例更好的方法?

C# 对于MVVM,有没有比使用静态类或单例更好的方法?,c#,wpf,mvvm,C#,Wpf,Mvvm,我发现在很多情况下,在我的WPF-MVVM应用程序中为模型使用单例或静态类似乎(至少表面上)是有意义的。这主要是因为我的大多数模型需要在整个应用程序中访问。使我的模型静态是满足此要求的一种简单方法 然而,我很矛盾,因为这个星球上的每个人似乎都讨厌单身。因此,我想知道没有更好的方法,或者我是否做了一些明显错误的事情?我认为这个问题的公认解决方案是使用依赖注入。使用依赖项注入,您可以将模型定义为常规的非静态类,然后在需要时使用控制反转容器“注入”模型的实例 wpftutorial.net上有一个很好

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


然而,我很矛盾,因为这个星球上的每个人似乎都讨厌单身。因此,我想知道没有更好的方法,或者我是否做了一些明显错误的事情?

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


wpftutorial.net上有一个很好的教程,介绍了如何在WPF中进行依赖项注入:

单例有几个问题。我将在下面概述它们,然后提出一些替代解决方案。我不是那种“从不使用单身汉,或者你是个垃圾编码员”的人,因为我相信他们有自己的用处。但这些用途很少

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

  • 使用单例进行单元测试比较困难

  • 它是全局变量的廉价替代品(我的意思是,虽然它可能有方法和其他新奇的东西,但单例终究是这样的)

  • 看,这并不是说Singleton本身就是“可怕的讨厌”,而是它是许多新程序员要处理的第一个设计模式,它的“便利性”掩盖了它的陷阱(只需在它上面加上一些齿轮,称之为蒸汽朋克)

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

    那么,其他选择呢?将模型传递到需要它的位置。这使得单元测试更容易,并允许您在一次心跳中交换该模型的基本原理。这也意味着您可能想看看接口——它们表示一个契约。然后,您可以创建实现这些接口的具体对象,瞧,您的代码很容易进行单元测试和修改


    在单例世界中,对单例进行一次更改就可以从根本上打破代码库中的一切。这不是一件好事。

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

    但即使这样,使用Unity(或另一个依赖项注入/容器)来管理只需要其中一个类的实例也是非常可能的

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


    顺便说一句:静态和单例不一样。但我不想在这里讨论这个问题。只要在stackoverflow上搜索更多有趣的问题:)

    使“模型”保持静态??不,不是真的。一点也不。那比他还要糟糕。我明白了,无法抗拒。如果使用DI,而不是使其成为静态的,请使用ContainerControlledLifetimeManager在容器中注册它。使用static时,线程安全性会出现更多问题。几周前我开始学习DI。看来我会把它捡起来的。谢谢,很好。我甚至会说:永远不要使用singleton,除非你没有其他选择。