Как подписаться на событие завершения работы приложения в библиотеке классов - PullRequest
3 голосов
/ 03 августа 2011

Существует библиотека классов, используемая некоторым приложением.Он содержит класс A для внешнего использования со статическим полем другого частного класса B внутри библиотеки.Пользовательское приложение использует экземпляры класса A. из библиотеки.

. В связи с завершением работы приложения я хотел бы выполнить некоторую очистку в классе B. Возможно ли перехватить событие завершения работы приложения в классе B без каких-либо действий со стороны пользователя?приложение?

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

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

Ответы [ 2 ]

5 голосов
/ 03 августа 2011
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
    }
}
2 голосов
/ 03 августа 2011

Если я правильно понимаю, ваша модель выглядит следующим образом:

Initial scenario

Затем вы хотели бы, чтобы ClassB связывался с Application через ClassA, как показанониже:

Goal

С точки зрения объектно-ориентированного проектирования это нарушает Закон Деметры , который гласит, что объекты должны общаться только со своимипрямые соседи .В связи с этим я бы предложил вам выполнить очистку в 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
    }
}
...