gpt4 book ai didi

c# - Messenger 库中联系人列表/花名册下载/同步的理想设计模式

转载 作者:行者123 更新时间:2023-11-30 18:39:22 25 4
gpt4 key购买 nike

MessengerClient 类中有一个登录 函数。 MessengerClient 类有一个 LoggedIn 事件和一个 IsLoggedIn 属性。

当在 MessengerClient 类上调用 Login 时,通过套接字从远程服务器获取联系人列表/花名册并进行处理,然后客户端被视为已登录IsLoggedIn 将返回 true。 LoggedIn 事件在登录函数内部引发(因此,在同一线程内请求登录——我认为这不是坏事)。

登录后,客户端会在更新发生时从远程服务器接收实时更新。

在登录期间处理联系人列表/花名册时,我认为最终用户的理想设计是在客户端被视为已登录之前处理所有联系人列表/花名册数据。这样,当用户收到 LoggedIn 事件,他们能够立即访问联系人数据。

例如-

这里我们有 LoggedIn 事件的最终用户处理程序。

    void MsgrLoggedIn(object sender, EventArgs a)
{
_msgr.Contacts.Contains("billy@bob.com"); //returns true
}

因为在客户端被标记为已登录之前所有联系人列表都已处理,并且在引发 LoggedIn 事件之前,上述语句返回 true。从逻辑上讲,我相信这是最终用户所期望的,因为下载和处理联系人列表是登录操作的一部分。

现在,我还喜欢在联系人已添加到联系人列表或添加到群组时引发事件。按照我到目前为止提到的逻辑,在处理数据时引发 ContactAddedContactAddedToGroup 等事件显然没有意义,因为这会导致最终用户在 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 的事件类。事件可以以这种方式排队,然后在登录后一个一个地调用。

如果有的话,哪些模式会被认为是更常见的做法。或者是否有其他方法可以实现这一目标?

很抱歉问了这么长的问题,但这不是一个简单的问题。

谢谢

最佳答案

每个联系人都有自己的联系人列表。

public class Contact
{
List<Contact> Contacts;
}

每个联系人都有自己的事件(PropertyChanged、LoggedIn 等)

public class Contact
{
List<Contact> Contacts;
public event OnPropertyChanged;
}

如果联系人登录,此联系人将注册到其联系人列表中每个联系人的所有事件。

public void LogIn
{
//Load Contact List for User - Do other stuff
foreach(Contact c in Contacts)
c.PropertyChanged += new PropertyChangedEventHandler(ContactPropertyChanged);
}

现在,如果联系人列表中发生了某些事情,那些已登录并在列表中有此联系人的人将获得事件。

public void ChangeProperty
{
//Change Property and raise event!
}

关于c# - Messenger 库中联系人列表/花名册下载/同步的理想设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10086617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com