2017-08-04 179 views
0

事件,我想了解在傳統的Silverlight application.In這段代碼的一段代碼,你可以看到用戶可以發佈事件和訂閱該事件。發佈和訂閱在Silverlight

同時發佈事件

Messenger.Publish<ErrorInformationData>(MessageConstant.ShowMessageTechnicalError, 
new ErrorInformationData(ServiceOperationName.ClaimsService_GetClaim, ServiceOperationOccurence.DataServiceUI)); 

然後訂閱該事件

Messenger.Subscribe<ErrorInformationData>(
           this, 
           MessageConstant.ShowMessageTechnicalError, 
           (result) => 
           { 
            Messenger.Publish(MessageConstant.ShowMessage, 
             new MessageData 
             { 
              Title = "Common$TechnicalError", 
              MessageText = "Common$TechnicalErrorDetail", 
              TextParameters = new object[] { result.OperationErrorCode.ToString() }, 
              MessageType = MessageData.MessageTypes.OK, 
              OKAction =() => 
              { 
               HtmlPage.Window.Navigate(new Uri("", UriKind.Relative)); 
              }, 

              MessageLevel = MessageData.MessageLevels.Error 
             } 
            ); 
           } 
           ); 

問題是,爲什麼我需要使用這個框架,而不是我可以簡單地調用method.Also任何人都可以點任何關於此通信的文檔/教程。

+0

很難說這段代碼。可能有一個正在使用的MVVM庫。因爲它是communicatie命令等看看項目的引用部分已知的方式,可以解釋這種類型的消息的。它可能會對使用外部依賴關係有所瞭解。 –

+0

的代碼看起來是實現調解模式。用於解耦模型之間的通信。 – Nkosi

回答

0

感謝@Nikosi爲指針,更多的調查後,我發現了什麼引擎蓋下回事。

因此,有一個IMessanger接口包含發佈,訂閱和退訂方法的簽名。

public interface IMessanger : IDisposable 
{ 
     void Subscribe(IReceiver receiver, int messageId);  
     void Publish<TEventArgs>(object sender, TEventArgs e, int messageId) 
      where TEventArgs : EventArgs;  
     void Unsubscribe(IReceiver receiver, int messageId); 
} 

現在我們定義一個實現接口的類Messanger。現在

public sealed class Messanger : IMessanger 
    { 
     private readonly Dictionary<int, List<IReceiver>> messageIdToReceiver; 

     public Messanger() 
     { 
      this.messageIdToReceiver = new Dictionary<int, List<IReceiver>>(); 
     } 

     public void Subscribe(IReceiver receiver, int messageId) 
     { 
      List<IReceiver> receivers; 

      if (this.messageIdToReceiver.TryGetValue(messageId, out receivers)) 
      { 
       receivers.Add(receiver); 
      } 
      else 
      { 
       this.messageIdToReceiver.Add(messageId, new List<IReceiver>() { receiver }); 
      } 
     } 

     public void Publish<TEventArgs>(object sender, TEventArgs e, int messageId) 
      where TEventArgs : EventArgs 
     { 
      List<IReceiver> receivers; 

      if (this.messageIdToReceiver.TryGetValue(messageId, out receivers)) 
      { 
       foreach (IReceiver receiver in receivers) 
       { 
        IReceiver<TEventArgs> receiverToReceive = receiver as IReceiver<TEventArgs>; 

        if (receiverToReceive != null) 
        { 
         receiverToReceive.Receive(sender, e, messageId); 
        } 
       } 
      } 
     } 

     public void Unsubscribe(IReceiver receiver, int messageId) 
     { 
      List<IReceiver> receivers; 

      if (this.messageIdToReceiver.TryGetValue(messageId, out receivers)) 
      { 
       if (receivers.Count > 1) 
       { 
        receivers.Remove(receiver); 
       } 
       else if(receivers.Count == 1) 
       { 
        this.messageIdToReceiver.Remove(messageId); 
       } 
      } 
     } 

     public void Dispose() 
     { 
      this.messageIdToReceiver.Clear(); 
     } 
    } 

public interface IReceiver<TEventArgs> : IReceiver 
     where TEventArgs : EventArgs 
    { 
     void Receive(object sender, TEventArgs e, int messageId); 
    } 

    public interface IReceiver : IDisposable 
    { 

    } 

我們可以看到上面的,定義了兩個班一個發佈事件,另一種是接收事件的使用。

public class PresenterA : IReceiver<EventArgs>, IDisposable 
    { 
     readonly IMessanger messanger; 

     public PresenterA(IMessanger messanger) 
     { 
      this.messanger = messanger; 
      this.messanger.Subscribe(this, (int)PubSubMsg.AppInstl); 
     } 

     public void Receive(object sender, EventArgs e, int messageId) 
     { 
      if ((PubSubMsg)messageId == PubSubMsg.AppInstl) 
      { 
       //Now that you received the message, update the UI, etc... 
      } 
     } 

     public void Dispose() 
     { 
      this.messanger.Unsubscribe(this, (int)PubSubMsg.AppInstl); 
     } 
    } 

    public class PresenterB 
    { 
     readonly IMessanger messanger; 

     public PresenterB(IMessanger messanger) 
     { 
      this.messanger = messanger; 
     } 

     public void btnApplicationRemove(object sender, EventArgs e) 
     { 
      //Do what you need to do and then publish the message 
      this.messanger.Publish<EventArgs>(this, e, (int)PubSubMsg.AppInstl); 
     } 
    } 

    public enum PubSubMsg 
    { 
     AppInstl = 1 
    }