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