【问题标题】:keeping an instance of an object avaliable throughout an entire application在整个应用程序中保持对象的实例可用
【发布时间】:2014-05-31 01:55:45
【问题描述】:

昨天,我在暑期实习中获得了一个项目,需要在 Visual Studio 2010 中同时使用 XAML 和 C# 来制作我创建的控制台应用程序的 WPF 版本。不幸的是,直到 3 天前我都没有使用这两种语言的经验,所以虽然这个问题的解决方案可能很简单,但它却让我无法理解,我无法在网上找到任何可用的解决方案

本质上,当我启动这个 WPF 应用程序时,我想实例化一个在 C# 应用程序内部定义的对象。我希望这个类的实例在应用程序运行的整个时间内都可用。我想知道这是否可以通过为应用程序创建全局资源来实现,但据我所知,这只能用于 XAML 资源。

任何帮助和想法将不胜感激。如果我写的任何内容太含糊,请告诉我,我会尽力澄清

【问题讨论】:

  • 我猜你想要一个static 变量。
  • 两种方法:依赖注入或静态服务。你的设想是什么?

标签: c# wpf xaml


【解决方案1】:

资源通常用于 XAML 类型的事物(样式、转换器实例等)。

这似乎是静态类的一个很好的用例。静态类在第一次使用时被实例化,并且只有一个实例。您还可以使用单例(通常利用静态成员)。

请注意,单例可能是一种代码味道,但如果你知道你需要一个,那就去做吧!不过,资源不是去这里的方法。

一个简单的单例示例:

public class MyGlobalClass
{
    private Lazy<MyGlobalClass> _instance = new Lazy<MyGlobalClass>();
    public static MyGlobalClass Instance { get { return _instance.Value; } }

    //Whatever else, accessed by MyGlobalClass.Instance.<Whatever>
}

【讨论】:

  • 所以我会创建一个构造函数,然后在构造函数类中创建它的静态实例?
  • @nwrobinson,您不会“创建”静态实例,框架会为您完成。您只需使用它,它就作为应用程序级对象存在。在我的显式单例示例中也是如此。那有意义吗?我很乐意提供您需要的任何信息。
  • 这可能与您解释的不完全一样,但您的回答让我搞砸了静态事物,我最终创建了一个具有静态属性的静态类。这基本上完成了同样的事情吗?
  • @nwrobinson 是的,这是我示例的“静态类”版本。我的单例示例的一个优点是它可以依赖注入,而标准静态类不能。很高兴你成功了!
  • 谢谢你的帮助,我还有一个问题要确保我理解它是如何正确工作的——我可以在这个类中创建方法,它们只适用于这个特定的静态对象,对吗?
【解决方案2】:

BradleyDotNet 似乎涵盖了基本答案。此外,您可能希望研究使用 IoC 容器并让它管理单例实例。所以没有静态,没有实现单例模式,只需让 IoC 容器处理该责任。

另外一个警告词,静态 != 线程安全,因此如果有多个线程访问您的单例对象,请确保考虑线程安全。

【讨论】:

  • 这个程序永远不会复杂到遇到这个问题。从本质上讲,它只是允许用户从公司软件上传日志文件,对其进行解析,然后允许他们执行诸如搜索或查看特定类型的错误之类的操作,这样他们就不必挖掘数千甚至数百万的错误的日志行。更多的是关于便利而不是力量
  • 我刚刚写了一些非常相似的东西,不,没有 IoC :) 只是好奇 - 这个全局对象中会有什么样的东西?
  • 正在查看的日志,以及用户可能在日志中放置的任何过滤器的状态。例如,如果 LogParser.searchQuery = nvidia,则显示的日志将仅是包含短语 nvidia 的日志。
猜你喜欢
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多