3

一部のアプリケーションで使用されるクラスライブラリがあります。これには、ライブラリ内の別のプライベートクラスBの静的フィールドで外部使用するためのクラスAが含まれています。ユーザーアプリケーションは、ライブラリのクラス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 明示的に記述します。このようにして、C#の内部クラスが外部クラスのプライベートメンバーにアクセスできるため、内部でApplication公開されたイベントを簡単にサブスクライブできます。ApplicationClassAClassB

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 に答える