C# Как создать Singleton, который публикует события и классы, которые подписываются?
Цель: иметь возможность публиковать события в одном экземпляре и разрешить любому классу подписываться / прослушивать эти события
Проблема: я не могу понять, как это сделать. Код ниже является незаконным, но он обеспечивает то, что я пытаюсь сделать
TransmitManager Class - Издатель
//Singleton
public sealed class TransmitManager
{
delegate void TransmitManagerEventHandler(object sender);
public static event TransmitManagerEventHandler OnTrafficSendingActive;
public static event TransmitManagerEventHandler OnTrafficSendingInactive;
private static TransmitManager instance = new TransmitManager();
//Singleton
private TransmitManager()
{
}
public static TransmitManager getInstance()
{
return instance;
}
public void Send()
{
//Invoke Event
if (OnTrafficSendingActive != null)
OnTrafficSendingActive(this);
//Code connects & sends data
//Invoke idle event
if (OnTrafficSendingInactive != null)
OnTrafficSendingInactive(this);
}
}
Тестовый класс - подписчик на событие
public class Test
{
TrasnmitManager tm = TransmitManager.getInstance();
public Test()
{
//I can't do this below. What should my access level be to able to do this??
tm.OnTrafficSendingActive += new TransmitManagerEventHandler(sendActiveMethod);
}
public void sendActiveMethod(object sender)
{
//do stuff to notify Test class a "send" event happend
}
}
2 ответа
Решение
Вам не нужно делать события static
,
public event TransmitManagerEventHandler OnTrafficSendingActive;
public event TransmitManagerEventHandler OnTrafficSendingInactive;
Либо ваши события должны быть членами экземпляра, либо вы должны рассматривать их как статические.
TransmitManager.OnTrafficSendingActive +=...
ИЛИ ЖЕ
public event TransmitManagerEventHandler OnTrafficSendingActive;
...
TransmitManager.Instance.OnTrafficSendingActive+=...
Также: используйте EventHandler в качестве делегата события. Попробуйте создать собственный класс аргументов и передать статус только одному событию вместо нескольких событий. Это позволит вам также передавать статусные сообщения.