【问题标题】:C# - Global Program ObjectC# - 全局程序对象
【发布时间】:2011-01-14 21:27:07
【问题描述】:

场景

我有一个围绕 Log4Net 的非静态类。这真的很方便,因为它可以链接到我拥有的另一个应用程序,该应用程序显示在我编写的各种软件中发生的不同进程的日志(以便我查看错误发生的位置、批处理失败等)

问题

这一切都很好,但是如果我想记录整个过程,我必须做一系列事情:

  1. 实例化 Logging 对象。
  2. 告诉它开始。
  3. 日志内容。
  4. 让它停下来。

这意味着如果一个进程在类之外运行,我必须搞砸传递 Logging 对象,这很痛苦而且看起来很乱。

问题

我怎样才能基本上以这样一种方式声明对象,它可以被所有类全局访问......并且将其设为静态并不是一个真正的选择,我不认为。

.....这可能是浪费时间,但我喜欢意见。

【问题讨论】:

  • 为什么不将包装器设为静态选项?这正是静态类有意义的情况。

标签: c# oop static


【解决方案1】:

为什么您认为不能将“它”设为静态?我怀疑您混淆了静态 class 和静态 variable 的概念,后者维护对非静态类实例的引用。

public class Foo
{
    // Instantiate here, or somewhere else
    private static LogWrapper logWrapper = new LogWrapper(...); 
    public static LogWrapper LogWrapper { get { return logWrapper; } }
}

仅仅因为 class 是非静态的并不意味着您不能拥有全局可用的单例实例。通常不是一个好主意,但对于日志记录来说还不错。

如果你确实走单身路线,你可以考虑阅读我在implementing a singleton in C#上的文章。

【讨论】:

  • 我认为他的意思是让整个班级成为静态的。
  • @Slaks:我的意思是他不必这样做。区分静态类和具有全局可用实例的非静态类很重要。 (这并不意味着它必须是单例,但它可能。)
  • 我意识到了;这也是我的观点。但是,从您的第一行来看,您可能误解了他。
【解决方案2】:

听起来你想要singleton

您可以创建一个返回类的单个实例的静态属性。

【讨论】:

    【解决方案3】:

    您可以使用Dependency Injection (DI) 和IoC Container framework 进行调查,而不是沿着静态路径或单例路径。这将使您的类保持可测试性,并将它们与日志记录类分离。

    IoC 容器将为您处理生命周期管理;通过指定容器生命周期,您可以模拟一个没有任何缺点的 Singleton。

    有一个学习曲线,但这是值得的; DI 还有许多其他优点。

    编辑:诀窍是避免服务定位器陷阱。 Mark Seemann 有一些很好的文章(和一本书即将出版)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 2011-12-17
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      相关资源
      最近更新 更多