今天整理了一下數據處理模塊的接口和類的關系圖
系統架構是基於接口來開發的,通過接口調用各模塊的實現,通過容器(Unity)配置具體實現類及相應的參數
所有功能都高度獨立和服用,空出來的精力可以把每個功能模塊做大做強(每個接口可以又n種實現,按需配置),本篇先講最基本的數據處理模塊的架構
一、數據處理通用接口

數據處理主要是5種接口,添加(IDataAdd)、修改(IDataUpdate)、刪除(IDataDel)、查看(IDataView)、獲取列表(IDataList)及數據操作總接口(IDataOperate)
以上5種接口定義基本能滿足大部分數據操作的需求
測試項目接口配置示例截圖:

二、數據庫處理子模塊相關實現

1、數據庫處理子模塊主要是TableOperate類(實現接口IDataOperate)
2、對數據庫操作必須指定數據庫和具體的表,分別通過DbConfig(IDbConfig)和TableSource(ITableSource)來配置,通過接口來獲取配置信息,如果有特殊的拆庫和拆表邏輯可以通過重新實現IDbConfig和ITableSource來實現
數據操作接口和實現都保持獨立,不需要修改
3、TableOperate本身沒有數據操作邏輯,是通過泛型倉儲類Repository<T>來操作數據庫的,倉儲類中保留對數據表和字段等信息的映射
其中泛型倉儲類Repository<T>中T就是數據領域的模型,該模型上有對數據庫中字段的映射關系
4、其實Repository<T>中也是通過對接ORM工具,該ORM工具我在很早就發文介紹過用法
注1:本來是有IRepository<T>接口的,作為TableOperate的屬性,IDbConfig和ITableSource是配置在IRepository<T>中的,后來刪除了,把Repository<T>封裝在TableOperate內部調用
注2:接口是要需要在配置文件中配置調用實例的
注3:這樣一來如果系統要更換第三方ORM工具就不能通過配置IRepository來實現了,還得實現ITableOperate接口和新的Repository<T>來實現
注4:為什么沒有IRepository<T>,是因為我為以后調用級權限控制留下空間,如果需要配置IRepository<T>,也就意味着拿個這個接口就可以對整個表做任何操作,這不是我想看到的結果
當然拿到IDataOperate接口也是可以對整個表做任何操作,但是還有其他接口(IDataAdd,IDataView)可用,只要在每個使用的地方配置最小權限接口,並封裝一個該接口的實現即可防止權限提升
測試項目配置示例截圖:

三、文本文件處理相關實現

1、文本操作同理也是有一個數據源配置接口IFileSource(及類FileSource)
2、文件操作實現暫時較為簡單,主要用於對配置文件操作及期緩存來用的
注:由於文件操作和數據操作同樣實現的數據操作基本接口,配置信息存儲可以在數據庫和文件中都很方便
五、數據處理適配類(DataOperate)

由於該架構是面向接口低耦合的,不同模塊間調用數據操作,但是引用另一個模塊的模型類顯然不能合適,那樣就成相互依賴了,這個時候這個類就出來調解這個尖銳矛盾了
1、DataOperate中屬性Operater是真是的數據處理對象
2、T類型是接入模塊的模型類,S是被調用的模塊的模型類,Converter(IConvertType)是中間的橋梁,負責兩種模型的相互轉化
3、IConvertType同樣是一個接口,可以自定類型轉化邏輯配置上,當然ConvertType類基本能滿足大部分轉化需求,因為ConvertType中有一個Map屬性,可以做好兩個類型中不同屬性名的映射
六、數據保存實現

1、其實沒有數據保存這塊涉及也是很處理這類需求,由於數據保存是系統間對接用到最頻繁的功能有必要單獨拿出來強化一下
2、典型的用法是日志記錄和數據同步,這些只要求一個單向的操作不需要相互交互
3、數據處理接口都有建模約束(where T : class, new()),而實際場景我們可能只是一個字符串、數據、Table等,這個時候建一個模型是可能有些浪費或者不方便,這個時候通過配置Converter來轉化為需要的格式
4、文件處理大部分並不需要模型,只要一個格式
這樣數據處理模塊也算告一段落,有什么調整的我會更新該文
有時間再補上“轉化和格式化"模塊(及Razor子模塊)、日志模塊、配置模塊、緩存模塊等接口及類圖,有時間我可能還會發示例項目代碼(實際項目代碼是不能發的,見諒)上來
最好強調一下面向接口編程的重要性,各個模塊都是可能相互調用的,但是我們不能相互引用,或者重復開發
比如日志模塊可能調用數據庫模塊存儲日志頁可以調用文件,或者http或socket等,日志模塊沒有必要引用所有可以存儲的方式,也沒必要再作一個文件日志子模塊,數據日志子模塊,等等,日志只要調用一個存儲接口(ISave),以后不需要修改日志模塊
另外日志可能使用數據庫存儲,數據庫操作也可能要記錄日志,兩個模塊會出現循環引用的情況,通過接口抽象可以避免模塊相互引用及以后擴展的問題
