C# 如何关联在引用的解决方案上触发的事件

C# 如何关联在引用的解决方案上触发的事件,c#,events,delegates,eventhandler,C#,Events,Delegates,Eventhandler,ConnectionManager如何获取AndroidBush类中捕获的expiredRegistrationId 我这样做不对吗 关于如何改进我的解决方案,有什么建议吗 有什么我可以遵循的模式吗 解决方案:经理 public class ConnectionManger { private readonly IPushManager pushManager = new PushManager(); public void NotifyAppUser(List<Push

ConnectionManager如何获取AndroidBush类中捕获的expiredRegistrationId

我这样做不对吗

关于如何改进我的解决方案,有什么建议吗

有什么我可以遵循的模式吗

解决方案:经理

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

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

    }
}
公共类ConnectionManger
{
private readonly IPushManager pushManager=new pushManager();
public void NotifyAppUser(列表注册表、警报)
{
pushManager.PushNotification(regIds,警报);
var expiredRegistrationId=??
}
}
解决方案:推送通知

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

        } 



    }
公共类PushManager:IPushManager
{
公共无效推送通知(列表注册电话、警报)
{
AndroidPush AndroidPush=新的AndroidPush();
androidPush.Push(警报、注册电话);
}     
}
公共类AndroidPush:IPUsNotificationStrategy
{
公共作废推送(警报、列表注册ID)
{
//等待GCM服务器
#区域GCM事件
gcmBroker.OnNotificationFailed+=(通知、聚合eEx)=>
{
var expiredRegistrationId=aggregateEx.OldId;
问:如何将expiredRegistrationId传递给ConnectionManager类?
};
} 
}

您将.NET作为公共游乐场,因此有几个选项

假设:

  • 您所说的解决方案是指单独的dll
  • 您需要返回字符串列表(来自原始问题)
  • 您的代码使gcmBroker保持活动状态,因此OnNotificationFailed事件可以触发
那么这应该是可行的:

将IPushNotificationStrategy界面中的签名更改为

List<string> Push(Alert alert, List<string> registrationIds)
列表推送(警报、列表注册ID)
将此事件添加到IPushManager界面:

event Action<List<string>> ExpiredRegs;
事件动作到期时间段;
从PushManager实现并调用此事件:

public event Action<List<string>> ExpiredRegs;

// call this when Push returns some expiredRegs :
void OnExpiredRegs(List<string> expiredRegs) => ExpiredRegs?.Invoke(expiredRegs);
public event Action ExpiredRegs;
//当Push返回一些expiredRegs时调用此函数:
void OnExpiredRegs(列出expiredRegs)=>expiredRegs?.Invoke(expiredRegs);
订阅ConnectionManger中的事件:

pushManager.ExpiredRegs += OnExpiredRegs;

void OnExpiredRegs(List<string> expiredRegs)
{
    // whatever you need to do
}
pushManager.ExpiredRegs+=OnExpiredRegs;
void OnExpiredRegs(列出过期的段落)
{
//不管你需要做什么
}

将失败属性添加到类ConnectionManager,以便事件处理程序可以设置该属性。如果我将失败属性添加到ConnectionManager,AndroidPush无法设置该属性,因为它正被ConnectionManager引用,并导致循环引用。您需要使用该类的实例。您的问题缺少上下文,很好,而且太模糊了。不清楚为什么不从manager类订阅
OnNotificationFailed
事件。类似这样的设计是解决这个问题的正确方法,也就是说,不要期望通知项目了解有关manager项目的任何信息,而是使用C#events来允许manager项目响应通知项目中发生的特定事情。如果你想得到一个好的答案,你需要大大改进这个问题。@PeterDuniho我删除了不必要的代码,并简化了它。我希望这有点道理,我想得到什么?