目 錄
第七章 外部接口的設計... 2
7.1 插件接口... 2
7.2 圖形顯示接口... 3
7.3 數據導出接口... 5
7.4 服務組件接口... 6
7.5 插件管理器... 8
7.6 框架整合、重構... 9
7.7 小結... 10
開發者不僅可以二次開發設備驅動,還可以二次開發自定義圖形顯示形式、
自定義數據導出格式和多種業務服務,並且設備驅動接口與這三種接口進行事件響應和數據交互。
圖形顯示接口、數據導出接口和服務組件接口都繼承自統一的插件接口(IPlugins),主要是方便管理和擴展。插件接口的代碼定義如下:
public interface IPlugins : IDisposable { /// <summary> /// 服務Key,要求唯一 /// </summary> string ThisKey { get; } /// <summary> /// 服務名稱 /// </summary> string ThisName { get; } /// <summary> /// 更新設備數據,用於接收來自設備驅動的數據信息 /// </summary> /// <param name="devid">設備ID</param> /// <param name="obj">設備對象</param> void UpdateDevice(int devid, object obj); /// <summary> /// 移除設備,當框架平台刪除設備的時候進行響應。 /// </summary> /// <param name="devid">設備ID</param> void RemoveDevice(int devid); }
圖形顯示接口、數據導出接口和服務組件接口與插件接口的繼承關系如下圖:
設備驅動只要有更新數據就會通過事件把數據傳送到UpdateDevice接口裡,這個接口內部到底怎麼處理完全由二次開發者來決定。當觸發設備驅動的刪除事件,就會調用RemoveDevice接口,以刪除、釋放資源。
框架平台通訊設備驅動把數據采集上來的只是原始數據,經過處理後要形成業務數據,那麼就會有顯示、分析、查詢、打印、報表等業務功能,並且針對同樣的數據信息,不同的用戶要求處理的方式有很大的不同。這部分功能變動很大,但是又不能每次有變動就要去修改框架平台,因為框架是“穩定”的部分,形成版本控制後就不隨便改變了。
基於這樣考慮,作為框架要提供一個機制,能夠加載二次開發者設計的UI窗體。用於顯示采集終端設備的數據,可以把不同類型設備的數據以多種形式集成顯示在不同界面上。方便為用戶提供多種的、更友好的人機交互界面。
首先,框架平台不能在啟動的時候就顯示所有UI窗體,具體要顯示哪個UI窗體完全由用戶自己決定,所以,我們要通過配置文件的形式把二次開發的組件信息加載到菜單裡,提供可觸發的顯示事件入口,如下圖:
其次,那麼以什麼樣的形式顯示窗體呢?像很多管理系統一樣,我們采用Form Tab的方式顯示,如下圖:
public interface IGraphicsShow : IPlugins { /// <summary> /// 關閉窗體事件時發生 /// </summary> event GraphicsShowClosedHandler GraphicsShowClosedHandler; /// <summary> /// 單擊右鍵 /// </summary> event MouseRightContextMenuHandler MouseRightContextMenuHandler; }
在數據集成系統項目中,要麼是集成其他廠家的設備數據,要麼是其他廠家集成自己家的設備數據,在沒有統一的標准前提下,會有各種集成數據的格式。為了滿足此類的場景,為設備導出數據專門設計了接口,開發者可以繼承該接口,設備在處理完數據後,會把數據自動傳輸到該接口,可以按規定的數據格式進行輸出了。
對設備驅動實時數據導出,可以把一類的設備數據導出成多種數據格式。
導出數據插件可以通過配置文件進行加載,只要設備驅動有數據更新,就把數據通過事件傳遞給導出數據接口。不在配置文件中配置插件信息,則程序不進行加載,不進行導出操作。所以,這種事務性的服務不需要界面來完成,可以在宿主程序啟動時通過代碼來完成。
IExportData數據導出接口代碼定義如下:
public interface IExportData:IPlugins { /// <summary> /// 格式化數據 /// </summary> /// <param name="devid"></param> /// <param name="obj"></param> /// <returns></returns> object FormatDataString(int devid, object obj, DeviceType devicetype); }
圍繞著設備驅動模塊采集的數據,根據應用場、需求,可以提供多種應用服務,例如:數據轉發服務、4-20mA服務、短信服務、LED服務、OPC服務、以及復雜的實時數據分析服務等。在保障數據實時性、穩定性的前提下,服務接口可以提供統一的服務機制,方便開發者進行二次開發。
服務插件的服務方式,這種服務是長期運行的事務性任務,所以更復雜一些。
有些服務需要隨宿主程序啟動而自動運行,有些服務需要人工手動啟動才運行。在宿主程序啟動的時候通過配制文件要把服務的信息加載到菜單上,菜單裡顯示的服務可能有些已經啟動了;有些需要通過單擊操作,顯示窗體並填寫必要的信息後才可能啟動。所以,宿主程序與服務插件不是單向交互,而是雙向數據、事件交互。
IappService服務接口在IPlugins基礎上進行擴展,增加了函數、屬性和事件,代碼定義如下:
public interface IAppService : IPlugins { /// <summary> /// 啟動服務 /// </summary> void StartService(); /// <summary> /// 是否自動啟動 /// </summary> bool IsAutoStart { set; get; } /// <summary> /// 服務類型 /// </summary> ServiceType ServiceType { set; get; } /// <summary> /// 單擊事件,關聯菜單 /// </summary> void OnClick(); /// <summary> /// 釋放服務 /// </summary> void ReleaseService(); /// <summary> /// 寫日志事件 /// </summary> event WriteLogHandler WriteLogHandler; }