MessengerClient类上有一个Login函数。MessengerClient类有一个LoggedIn事件和一个IsLoggedIn属性。
当在MessengerClient类上调用Login时,联系人列表/名册通过套接字从远程服务器获取并进行处理,然后认为客户端已登录并且IsLoggedIn将返回 true。LoggedIn事件在此之后的 Login 函数内引发(因此,在请求登录的同一个线程内 - 我不认为这是一件坏事)。
登录后,客户端会在发生时从远程服务器接收实时更新。
在登录期间处理联系人列表/名册时,我相信最终用户的理想设计是在客户端被认为已登录之前处理所有联系人列表/名册数据。这样,当用户收到LoggedIn事件时,他们能够立即访问联系人数据。
例如 -
这里我们有LoggedIn事件的最终用户处理程序。
void MsgrLoggedIn(object sender, EventArgs a)
{
_msgr.Contacts.Contains("billy@bob.com"); //returns true
}
由于在客户端被标记为已登录之前已处理了所有联系人列表,并且在引发 LoggedIn事件之前,上述语句返回 true。从逻辑上讲,我相信这是最终用户所期望的,因为下载和处理联系人列表是登录操作的一部分。
现在,我还喜欢在将联系人添加到联系人列表或添加到组时引发事件。按照我到目前为止提到的逻辑,在处理数据时引发ContactAdded、ContactAddedToGroup等事件显然是没有意义的,因为这将导致最终用户在 MessengerClient 类甚至之前收到这些事件之一标记为已登录。
void MsgrContactAdded(object sender, ContactEventArgs e)
{
_msgr.SendMessage(e.Contact, "hello there"); // throws NotLoggedInException
}
如上所示,会导致坏事发生。
所以我真正需要做的是处理联系人列表数据,引发登录事件,然后引发所有其他联系人事件。
为此,我可以遍历所有联系人对象、组对象等并引发适当的事件。
到目前为止还好,对吧?
然而,问题在于,除了在首次登录时下载联系人列表数据之外,如果客户端注销然后重新登录,我还必须准备同步联系人数据。
这将涉及诸如 ContactRemoved、ContactNameChanged、ContactRemovedFromGroup 等事件。
因此,它不再像遍历联系人、组等那样简单,因为现在我必须考虑已删除或属性已更改的联系人。
所以我需要一种替代方法来“排队”这些事件在登录发生后引发。
我考虑过用类来表示每个同步事件——例如 SyncContactRemoved、SyncContactNameChanged、SyncContactAddedToGroup。有了这个,我可以处理数据,为每个事件创建一个 Sync*XXX* 类,并将它们添加到一个列表中,然后我可以在登录后对其进行迭代。
我还考虑过对对象本身使用方法。即 Group.SyncContactsAdded、Contact.SyncNameChanged、MessengerClient.SyncContactsAdded。然后我可以在登录后遍历联系人/组等,检查这些属性,在必要时引发事件,然后清除它们。
最后,我考虑了一个包含 EventHandler 和 EventArgs 的 Event 类。事件可以以这种方式排队,然后在登录后一一调用。
如果有的话,这些模式中的哪一个会被认为是更常见的做法。还是有其他方法可以实现这一目标?
我为这么长的问题道歉,但这不是一个简单的问题。
谢谢