2017-08-04 4 views
0

これまでのSilverlightアプリケーションのコードを理解しようとしています。このコードでは、ユーザーがイベントをパブリッシュしてそのイベントを購読できます。Silverlightでのイベントのパブリッシュとサブスクライブ

その後、私は単ににmethod.Alsoすることができます誰でもポイントを呼び出すことができる場所の代わりにこのフレームワークを使用する必要がない理由

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 
             } 
            ); 
           } 
           ); 

質問があり、そのイベントをサブスクライブイベント

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

を公開しながら、このコミュニケーションに関するドキュメンテーション/チュートリアル。

+0

このコードからは分かりにくいです。使用中のMVVMライブラリがある可能性があります。これは、コマンドの通信などのための既知の方法であるので、このタイプのメッセージングを説明することができます。プロジェクトの参照セクションを見てください。それは、外的依存がどのように使われているかを明らかにするかもしれない。 –

+0

メディエータパターンを実装しているように見えます。モデル間の通信を切り離すために使用されます。 – Nkosi

答えて

0

ポインタのために@ニコシさんに感謝します。より多くの調査の後、私はボンネットの下で何が起こっているかを発見しました。

したがって、publish、subscribe、およびunsubscribeメソッドのシグネチャを含む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 
    { 

    } 

今、私たちは、上記の定義された2つのクラス1のイベントを公開し、他の1がイベントを受信して​​いるの使用状況を見ることができます。

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 
    } 
関連する問題