有朋友突然問我是不是改行搞SEO了。當時聽了有點驚奇,原來是blogs上文章最近都是和SEO相關的 (*^__^*)。問問朋友現在忙些什麼東西,他說在做一些日誌記錄的東西,問我有沒有什麼好的建議(log4.net開源組件不錯)。還是具體問了朋友的一些需求,這個和我們的廣告統計日誌相識。我就想到寫這篇文章了,也避免一下,大家認為我SEO去了。
需求及設想:
1:統計每日使用者的點擊量。
2:考慮到並發和資料庫的壓力。資料先寫入記憶體,在一定間隔時間將資料變化統一寫入資料庫。
3:需要考慮擴充統計不同的業務類型,比如 廣告統計、註冊統計。
業務分析:
業務上有擴充統計類型的需要,那麼必然要定義一個服務介面:
Interface IDayLog
服務需要實現的方法:
Add(); 添加日誌記錄到記憶體
Save();儲存日誌記錄到資料庫
Clear();清空記憶體日誌記錄
根據目前業務需求,定義兩個業務類:
RegDayLog:IDayLog 每天的登入日誌統計
AWDayLog:IDayLog 每天的廣告日誌統計
這裡具體展開一下AWDayLog的系統記錄,根據業務需求,需要在子類上添加幾個屬性:
AWID 需要記錄的廣告ID
Count 廣告ID的增量值
static Dictionary<int, int> adWords 廣告的記憶體資料
這些和業務相關類都有了,接下來我們需要一個控制類(和具體業務無關,用來控制商務程序)
static class DayLogHelper 定義幾個和業務相關的屬性和方法:
static Dictionary<String, IDayLog> dayLogList 當前載入的日誌業務列表
CreateLog() 負責載入需要添加日誌記錄的業務模組
Start() 負責開機記錄記錄
FindLog(string logName) 根據logName找到相應的日誌業務模組
LogName枚舉 系統中日誌的類型(這個枚舉可以通過配置進行忽略)
具體的類圖:
從UML類圖中我們可以得到如下資訊:
1:Client類為具體的調用類,從類的關係圖中可以很清楚的看到,Client只和LogName 枚舉、DayLogHelper、IDayLog 有依賴關係。這就說明,我們在模組的外部已經不依賴具體的業務類了,既然這樣,那麼業務發生變化也不會影響到Client調用。松耦合了。
2:可以改進的地方。首先看圖中標記《3》說明如果要新增業務類,就要要改動DayLogHelper。《1》《2》《3》 這三條依賴關係是需要new 具體的業務對象時產生的。那麼如何刪除這3條依賴關係呢?如何達到解耦的目的呢?設定檔,通過讀取設定檔和反射的方式來建立對象。也就是說,如果我們新增加一個“D幣日誌統計”,我只要新增一個DCashDayLog類、WebConfig添加一條設定檔就可以了,對日誌模組不需要做其他處理。當然Web層上需要調用DayLogHerlper添加具體的日誌資料,但這和模組本身已沒關係了。
總結
線上啟動並執行日誌模組和這個也差不多,具體的實現代碼就不寫了。其實說白了就是通過Interface隱藏了具體的業務類型,通過DayLogHelper 封裝了具體業務類的建立過程。寫累了,喝茶去了!
Google 標記: .NET, 日誌記錄, 松耦合, UML類圖設計