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 в качестве делегата события. Попробуйте создать собственный класс аргументов и передать статус только одному событию вместо нескольких событий. Это позволит вам также передавать статусные сообщения.

Другие вопросы по тегам