2017-08-04 1 views
-2

Comment ConnectionManager peut-il obtenir expiredRegistrationId capturé dans la classe AndroidPush?Comment câbler les événements déclenchés sur une solution référencée

Est-ce que je fais cela dans le mauvais sens?

Des suggestions sur la façon dont je peux améliorer ma solution?

Y a-t-il un motif que je pourrais suivre?

Solution: Les gestionnaires

public class ConnectionManger 
{ 
    private readonly IPushManager pushManager = new PushManager(); 

    public void NotifyAppUser(List<PushNotificationSubscription> regIds, Alert alert) 
    { 
     pushManager.PushNotification(regIds, alert); 
     var expiredRegistrationId = ?? 

    } 
} 

Solution: PushNotification

public class PushManager : IPushManager 
    { 

     public void PushNotification(List<PushNotificationSubscription> registeredPhone, Alert alert) 
     { 

      AndroidPush androidPush = new AndroidPush(); 
      androidPush.Push(alert, registeredPhone); 

     }  

    } 


    public class AndroidPush : IPushNotificationStrategy 
    { 

     public void Push(Alert alert, List<string> registrationIds) 
     { 

      // Wait for GCM server 
      #region GCM Events 
      gcmBroker.OnNotificationFailed += (notification, aggregateEx) => 
      { 

       var expiredRegistrationId = aggregateEx.OldId; 
       Q: How do i pass expiredRegistrationId to ConnectionManager class? 
      }; 

     } 



    } 
+0

Annonce immobilière échoué à la classe ConnectionManager afin qu'il puisse être défini par le gestionnaire d'événements. – jdweng

+0

Si j'ajoute une propriété ayant échoué à ConnectionManager, AndroidPush ne peut pas définir cette propriété car elle est référencée par ConnectionManager et provoque une référence circulaire. –

+0

Vous devez utiliser une instance de la classe. – jdweng

Répondre

0

Vous avez .NET comme aire de jeux commune donc il y a plusieurs options

: En supposant

  • vous par des solutions séparées signifie dll's
  • vous devez retourner une liste de chaînes (de la question initiale)
  • votre code est de garder en vie gcmBroker si l'événement OnNotificationFailed peut tirer

alors cela devrait fonctionner:

Changer votre signature dans l'interface IPushNotificationStrategy à

List<string> Push(Alert alert, List<string> registrationIds) 

Ajouter cet événement à votre interface IPushManager:

event Action<List<string>> ExpiredRegs; 

Mettre en oeuvre et invoquer cet événement de PushManager:

public event Action<List<string>> ExpiredRegs; 

// call this when Push returns some expiredRegs : 
void OnExpiredRegs(List<string> expiredRegs) => ExpiredRegs?.Invoke(expiredRegs); 

Abonnez-vous à l'événement dans ConnectionManger:

pushManager.ExpiredRegs += OnExpiredRegs; 

void OnExpiredRegs(List<string> expiredRegs) 
{ 
    // whatever you need to do 
}