2013-06-04 36 views
6

我发现,在很多情况下,它似乎是(至少表面上)是有道理的使用单身或静态类在我的WPF的MVVM应用模型。大多数情况下,这是因为我的大多数模型都需要在整个应用程序中进行访问。制作我的模型static是满足这一要求的一种简单方法。有没有比使用MVVM的静态类或单例更好的方法?

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

+3

制作“模型”静态?不,不是。一点儿都没有。这甚至比[用RegEx解析HTML]还糟糕(http://stackoverflow.com/a/1732454/643085) –

+0

Heh。我无法抗拒,我看到了。 – sircodesalot

+0

如果使用DI,而不是将其设置为静态,则使用ContainerControlledLifetimeManager将其注册到容器中。有了静态,你有更多的是线程安全的问题。 –

回答

5

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

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

  2. 单体测试对单身人士来说更加困难。这是一个廉价的替代全局变量(我的意思是,这是一个单身人士在一天结束时,虽然它可能有方法和其他奇特的东西)。

看到,这并不是说辛格尔顿的是“可怕可憎”每本身,而是它的第一个设计模式,许多新的程序员去处理和便利混淆了陷阱(只要坚持一些齿轮它并称之为蒸汽朋克)。

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

所以,替代品?将模型传递给需要它的地方。这使得单元测试更容易,并且允许您在心跳中更换该模型的基础。这也意味着你可能想看看接口 - 这些表示合同。然后,您可以创建实现这些接口的具体对象,而且您的代码很容易进行单元测试,并且可以修改。

在单身人士的世界里,对单身人士的单一改变可以从根本上打破代码库中的一切。不是一件好事。

+0

尼斯。我甚至会说:除非你没有其他选择,否则不要使用单身。 –

2

我觉得接受的解决这个问题是使用依赖注入。当你想要它依赖注入,你可以定义你的模型作为常规,非静态类,然后有控制容器的反转“注入”模型的实例。

有一个在wpftutorial.net一个很好的教程,显示如何做到依赖注入在WPF:http://wpftutorial.net/ReferenceArchitecture.html

+0

有趣。几个星期前我开始学习DI。看起来像我将采摘回来了。谢谢。 – sircodesalot

2

我使用的唯一静态类是MessageBroker,因为我需要通过应用程序实现相同的实例。

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

这使您可以在需要时注入不同的版本(例如,期间的单元测试)

顺便说一句:静态是不一样的单例。但我没有深入这里。只是搜索stackoverflow更有趣的问题:)

相关问题