3

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

当应用程序关闭时,我想在 B 类中进行一些清理。是否可以在 B 类中捕获应用程序关闭事件而无需用户应用程序的任何操作?

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

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

2 回答 2

6
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
    }
}
于 2011-08-03T08:38:52.050 回答
3

如果我理解正确,您的模型如下所示:

初始场景

然后,您希望通过如下所示的方式进行ClassB通信:ApplicationClassA

目标

从面向对象设计的角度来看,这违反了得墨忒耳定律,该定律指出对象只能与其直接邻居对话ClassA在这方面,如果可能的话,我建议您在 中进行清理。

从实现的角度来看,我会通过在构造函数中获取它的实例来ClassA 明确声明它的依赖关系Application通过这种方式,您可以轻松订阅Application内部发布的任何事件,ClassA或者可能ClassB因为C# 中的内部类可以访问外部类的私有成员

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
    }
}
于 2011-08-03T08:53:24.287 回答