У меня все еще есть некоторые сомнения, поскольку я никогда не видел такого шаблона проектирования ни в одной библиотеке .NET
Да, вы правы, что беспокоитесь об этом. Подобные подписки на события очень непостоянны, источник событий всегда переживает подписчика. Я знаю только один класс в рамках, SystemEvents. Проблема состоит в том, что каждый подписчик должен очень осторожно отписаться, когда закончится его срок действия, или на объект останутся ссылки навсегда. Утечка памяти, которую очень трудно диагностировать.
Лучшим примером здесь является использование интерфейса. Давайте объявим один:
public class MyEventArgs { /* etc.. */ }
public interface IGlobalNotification {
event EventHandler Disposed;
void OnMessage(MyEventArgs arg);
}
Теперь вы можете создать форму для реализации интерфейса:
public partial class Form1 : Form, IGlobalNotification {
public Form1() {
InitializeComponent();
GlobalMessages.Register(this);
}
void IGlobalNotification.OnMessage(MyEventArgs arg) {
// do something
}
}
Метод Register регистрирует форму в классе GlobalMessages, событие Dispose гарантирует, что класс сможет обнаружить, что форма умирает:
public static class GlobalMessages {
public static void Register(IGlobalNotification listener) {
listener.Disposed += delegate { listeners.Remove(listener); };
listeners.Add(listener);
}
public static void Notify(MyEventArgs arg) {
foreach (var listener in listeners) listener.OnMessage(arg);
}
private static List<IGlobalNotification> listeners = new List<IGlobalNotification>();
}
Вызовите GlobalMessages.Notify (), чтобы метод OnMessage () выполнялся во всех экземплярах живых форм. Основным преимуществом этого подхода является то, что клиентский программист никогда не сможет испортить.