某个应用程序使用了一个类库。它包含一个外部使用的A类,以及库中另一个私有类B的静态字段。用户应用程序使用库中的A类实例。
当应用程序关闭时,我想在B级执行一些清理工作。 是否可以在没有用户应用程序的任何操作的情况下捕获B类中的应用程序关闭事件?
class B
{
public B()
{
// attach Handler() to applicaiton shutdown event
}
void Handler()
{
// do some work
}
}
答案 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)
如果我理解正确,你的模型看起来像这样:
您希望ClassB
与Application
通过ClassA
进行沟通,如下所示:
从面向对象的设计角度来看,这违反了Law of Demeter,其中指出对象应该只与他们的直接邻居交谈。在这方面,我建议你尽可能在ClassA
进行清理。
从实现的角度来看,我会让ClassA
在Application
上通过在构造函数中获取它的实例来显式声明其依赖。通过这种方式,您可以轻松订阅Application
内ClassA
发布的任何事件,或者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
}
}