WM有约II(六):分级限制
等级制度
在上一集里,我们把发送查询短信息的人分为"联系人"和"陌生人"两大类,应用程序会自动回复"联系人",忽略"陌生人",在这一集里,我们将会引入另外两种类型:"白名单"和"黑名单"。如果你看过上一集,你应该知道"联系人"和"陌生人"是互斥的,它们之间的区别是手机号码是否存在联系人里。"白名单"和"黑名单"是在"联系人"上发展出来的两个细分类型,它们也是互斥的,"白名单"允许执行所有查询,而"黑名单"则禁止执行所有查询。至于"陌生人",我们将会给它一个"注册"的机会,让它可以请求把自己加到联系人里。这四个等级将会通过AccessLevel枚举来表达:
代码 1
在这一集里,我们将会在这个"等级制度"的基础上实现如下效果:
访问级别 |
允许执行的操作 |
Whitelist |
PingStatus、PingSchedule |
Contact |
PingStatus |
Stranger |
SignUp |
Blacklist |
N/A |
白名单 & 黑名单
因为白名单和黑名单本质上只是两组姓名,所以我们选择最简单的文本文件来存储,每行一条记录。白名单和黑名单的管理分别由WhitelistManager和BlacklistManager来负责:
图 1
而读/写文本文件的任务则交给ReadAllLines和WriteAllLines两个方法:
代码 2
因为白名单和黑名单是互斥的,所以当我们向任一名单添加一个姓名时,必须确保该姓名不会出现在另一个名单里,比如说,当我们向白名单添加一个姓名时,如果该姓名已包含在黑名单里,则应先从黑名单删除该姓名,由于我们使用了BindingList,于是检查工作可以在ListChanged事件触发时展开:
代码 3
接着,我们需要两个窗体来编辑白名单和黑名单:
图 2
是不是觉得这两个窗体很眼熟?事实上,它们仿照了Status Texts Editor(参见《WM有约II(二):持续改进》的图1)的做法,所以这里就不详述了。
最后,我们需要在主窗体放置两个菜单项,以便打开Whitelist Editor和Blacklist Editor:
图 3
现在,我们来看看运行效果,一开始,白名单和黑名单都是空的,我们打开Whitelist Editor,单击Add按钮:
图 4
单击TextBox右边的"..."按钮,ChooseContactDialog对话框将会打开:
图 5
选中一个联系人,ChooseContactDialog对话框将会关闭,选中的联系人的姓名将会出现在Whitelist Editor下面的TextBox里:
图 6
单击OK把该姓名添加到白名单里,重复上面步骤添加另一个联系人:
图 7
单击Whitelist Editor右上角的OK按钮关闭窗体并保存白名单。接着,打开Blacklist Editor,参照上面的步骤把Allen Lee添加到黑名单:
图 8
由于白名单和黑名单是互斥的,此时白名单应该没有Allen Lee了,打开Whitelist Editor验证一下:
图 9