我有一个WPF应用程序,它是由一个MainWindow
,具有多种一起Page
,可以通过访问的对象MainWindow
。我目前有一个User
在中实例化的类ViewModel
,MainWindow
它定义了权限属性,这些属性绑定到相应的各种属性中View
:
public NavigationViewModel()
{
_currentUser = new User(_currentServerConnection, Environment.UserName);
现在,我想User
在每个Page
对象的中访问相同的实例ViewModels
。从设计的角度来看,最合适的方法是什么?我已经阅读了StackOverflow上的多个线程,并得出的结论是,我应该创建此类static
(在这里没有意义,此类具有state
),或在每个实例中对其进行实例化ViewModel
。我还有其他选择吗?哦,我也阅读了有关Singleton类的信息,显然不建议这样做。我觉得我在这里缺少一些基本概念。
不建议使用Singleton。建议不要在错误的地方或使用错误的方式使用单例。
您的整个问题都被当成是使用单例的好时机的“正确”和“正确”示例。
如果您绘制设计图,并且代码中大量对象指向另一个对象的完全相同的实例,并且不再需要该对象的第二个实例,那么您已经找到了单例的正确用法。根据您的描述,您处于这种情况。
现在,您还可以使用静态。静态和单例之间的唯一区别是,单例直到第一次使用才被实例化。由于加载后可能会有一个登录名,因此您最好等到第一次登录尝试实例化您的单例。这就是为什么要在静态对象上使用单例。
public class GlobalSettings : IGlobalSettings
{
public static GlobalSettings Instance
{
get { return _Instance ?? (_Instance = new GlobalSettings()); }
} static GlobalSettings _Instance;
public GlobalSettings()
{
}
// More methods/properties here
}
单例也可以在带锁的多线程应用程序中正常工作。请参阅这篇文章:http : //msdn.microsoft.com/en-us/library/ff650316.aspx
单例也很容易进行单元测试或在IOC中使用。否则,任何人都没有意识到您可以简单地使用接口来描述单例,然后所有使用单例的对象都可以具有该接口的实例。除非已经有IOC libray,否则我将使用如下所示的惰性属性注入。为此,我不会包括IOC库的膨胀。
public static IGlobalSettings Settings
{
get { return _Settings ?? (_Settings = GlobalSettings.Instance); }
} static IGlobalSettings _Settings;
或者,也可以让您的IOC控制器/工厂每次将您的Singleton实例作为界面返回。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句