2009-04-28 21 views
1

我正在编写一个静态类,以便在我开发的解决方案中使用日志记录。有几个组件将使用它,如控制台应用程序,ASP.NET应用程序,等等如何在应用程序启动和关闭时自动调用静态类中的方法?

对于日志记录工作,它需要做一些初始启动配置,然后才能使用它,也有一些每个应用程序完成后清理。

有没有办法在.NET中做到这一点,而不必expicitly调用StartLog()和FinishLog()方法从溶液中的每个应用程序?或者也许是完全看待这个问题的另一种方式?

我一直在考虑使用锁在每个日志()方法来检查日志类是否已经被初始化,但是潜在的开销,无论是在性能和​​复杂性让我害怕。

回答

3

您可以使用的东西的启动侧的类型初始化(例如静态构造函数) - 当你第一次使用类,将自动被调用。

检测关机更难...有AppDomain.ProcessExitAppDomain.DomainUnload可能够你...只是订阅事件,并作出相应的反应。

+0

这仍然需要他调用StartLog()(即第一次使用他的类)。我认为没有办法解决这个问题,只是认为这样做可能更好。 – 2009-04-28 13:35:19

+0

我正在考虑一个静态构造函数,看起来是它的等效析构函数:AppDomain.DomainUnload。但是,MSDN声明DomainUnload事件永远不会在默认应用程序域中引发,因此这似乎不是一个选项。 – 2009-04-28 14:21:40

2

对单身阅读起来,乔恩斯基特有great article。使用这个你可以确保这个类型只被构造一次。当他谈论锁的性能时,看看最后的结果。只是一些思考的食物。

0

Singleton模式,让你不会再实例Log类每次但使用getInstance()方法将工作

1

Singleton模式将可能最适合您。静态_instance变量在开始时被初始化,所以它的Log()构造函数被调用,你可以在这里进行初始化。因为它实现了IDisposable并且覆盖了Finalize,所以它将有Dispose()方法,当应用程序退出并且静态实例变量被处置时它将被调用。

public class Log : IDisposable { 
    private Log() { 
    // Initialize logic 
    } 

    public LogMessage(string wah) { 
    // Write 
    } 

    public void Dispose() { 
    // Clean up 
    } 

    public override void Finalize() { 
    Dispose(); 
    } 

    private static Log _instance = new Log(); 
    public static Log Instance { get { return _instance; } } 

    // You can also implement helper methods on static level if you want to keep the usage same. 
    public static Message(string wah) { 
    _instance.LogMessage(wah); 
    } 
} 
相关问题