以前一兩個月才出一篇,這三天有點變态地連續1天1篇(其實都是上周末兩天寫好的存貨)。
短期應該沒有新的和此架構相關的文章要寫了,這應該是最後一篇,大夥且看且珍惜。
前兩篇講資料庫讀寫分離和分布式緩存,這篇隆重地介紹一下:mdatatable,畢竟它有很多未公布或隐藏技能,值得一看。
1:操作資料庫:maction、mproc (名稱空間:cyq.data)
2:日志操作:log、syslogs(名稱空間:cyq.data)
3:配置和性能調試:appconfig、appdebug(名稱空間:cyq.data)
4:記憶體表體系:mdatatable(mdatarow、mdatacell) (名稱空間:cyq.data.table)
5:json系:jsonhelper (名稱空間:cyq.data.tool)
6:本地緩存和分布式緩存:cachemanage (名稱空間:cyq.data.cache)
掌握上面幾個類,基本就掌握了架構的核心了。
1:實體型操作資料庫:ormbase、simpleormbase、dbfast (名稱空間:cyq.data.orm)
2:html/xhtml模闆引擎:xhtmlaction、rss (名稱空間:cyq.data.xml)
3:aop程式設計:iaop接口 (名稱空間:cyq.data.aop)
4:資料庫結構工具:dbtool (名稱空間:cyq.data.tool)
5:文法糖及ui擴充:ifield接口、iuivalue接口、registerui (名稱空間:cyq.data.extension)
以上就是整個架構的所有,全部加起來目前編繹才300k左右,僅有一個dll,無任何其它直接依賴,但能做的事超出你想象。
下面開始介紹mdatatable
先看一張圖:

和支援的所有資料庫打通,這就是mdatatable的強大之處,任何一種資料庫的資料隻要流向mdatatable,都可以自由轉到任意一種資料庫輸出。
而實作這一切的方法就是:acceptchanges (acceptop op, string newconn, params object[] jointprimarykeys)
深受廣大網友喜愛的dbimport導資料庫工具,就是靠它完成的。
mdatatable和主流資料類型也打通了,即任意一種資料,經過mdatatable,就可以以任意一種資料格式輸出。
而實作這一切的方法就是:mdatatable.createfrom (object data) 和 tojson()、toxml()、tolist<t>()。
createfrom除了支援這幾種,其它字典型的如:dictionary、hashtable等實作ienumerable接口的都可以往裡塞。
如果隻有一行資料,就對應mdatarow的loadfrom方法。
對這種幾種類型,隻需要mdatatable dt=xxx;
靜态方法隻有一個,就是上面提到的:createfrom。
圖裡漏了一個方法:擷取某列的集合:list<t> getcolumnitems<t>
原來資料是這樣的:
調用之後資料是這樣的:
先看這一段截自分布式緩存memcache裡的代碼:
status有n個dictionary,每個字段轉成mdatatable後是這樣的:
每個表的key是一樣的,是以通過指定表的join類為key,然後把value改一下名稱即可。
表join後的結果是這樣的:
既然為動态屬性,說明它很動:
a:平時就是一個屬性,你可以把它當臨時存檔對象。
b:适用于批量事務時:如果acceptchanges失敗,dynamicdata會存檔exception異常。
c:通常一個指acceptchanges是一個事務,如果外部也有事務,希望在同一個事務時:
看一下asp.net aries裡關于送出使用者權限的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
<code>using</code> <code>(maction action = </code><code>new</code> <code>maction(tablenames.sys_roleaction))</code>
<code>{</code>
<code> </code><code>action.begintransation();</code>
<code> </code><code>action.delete(</code><code>"roleid='"</code> <code>+ roleid + </code><code>"'"</code><code>);</code>
<code> </code><code>dt.dynamicdata = action;</code><code>//傳遞資料連結</code>
<code> </code><code>dt.setstate(1);</code>
<code> </code><code>result = dt.acceptchanges(acceptop.insert);</code>
<code> </code><code>if</code> <code>(!result)</code>
<code> </code><code>{</code>
<code> </code><code>action.rollback();</code>
<code> </code><code>}</code>
<code> </code><code>action.endtransation();</code>
<code>} </code>
可以把maction或mproc對象傳遞給它,再執行事務,如此,就共用了一個連結了,啟到同一個事務的作用。
mdatatable 在此架構中,像一個關鍵的路由結點,相當重要,輕輕了解,用好它,你的開發旅程會變的很輕松。
本文原創發表于部落格園,作者為路過秋天,原文連結:http://www.cnblogs.com/cyq1162/p/5618048.html