如何在类库中订阅应用程序关闭事件

时间:2011-08-03 08:12:34

标签: c# events class-library subscription application-shutdown

某个应用程序使用了一个类库。它包含一个外部使用的A类,以及库中另一个私有类B的静态字段。用户应用程序使用库中的A类实例。

当应用程序关闭时,我想在B级执行一些清理工作。 是否可以在没有用户应用程序的任何操作的情况下捕获B类中的应用程序关闭事件?

class B
{
    public B()
    {
        // attach Handler() to applicaiton shutdown event
    }

    void Handler()
    {
        // do some work
    }
}

2 个答案:

答案 0 :(得分:5)

using System.Windows.Forms;

public class B
{
    public B()
    {
        Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
    }

    void Application_ApplicationExit(object sender, EventArgs e)
    {
        //do cleanup of your class
    }
}

答案 1 :(得分:2)

如果我理解正确,你的模型看起来像这样:

Initial scenario

您希望ClassBApplication通过ClassA进行沟通,如下所示:

Goal

从面向对象的设计角度来看,这违反了Law of Demeter,其中指出对象应该只与他们的直接邻居交谈。在这方面,我建议你尽可能在ClassA进行清理。

从实现的角度来看,我会让ClassA Application上通过在构造函数中获取它的实例来显式声明其依赖。通过这种方式,您可以轻松订阅ApplicationClassA发布的任何事件,或者inner classes in C# can access the outer class' private members以来可能ClassB发布的事件:

public class A
{
    private readonly Application application;

    public A(Application application)
    {
        if (application == null)
        {
            throw new ArgumentNullException("application");
        }

        this.application = application;
        this.application.ApplicationExit += application_ApplicationExit;
    }

    private void application_ApplicationExit(object sender, EventArgs e)
    {
        // Perform cleanup
    }
}