總體描述
園子文章的圖中,畫出了efcachingprovider所擴充的位置:
也就是說,entityconnection不是直接使用sqlclient中間的sqlconnection,而是通過efcachingprovider把指令轉換後,再使用sqlclient執行。
解決方案結構
重點工程解釋:
efproviderwrappertoolkit:定義了擴充sqlclient的架構,其中包括:dbconnectionwrapper、dbcommandwrapper等。
efcachingprovider:以caching的方式實作了sqlclient的擴充,包括:dbcachingconnection、dbcachingcommand等。
eftracingprovider:在sqlclient的基礎上擴充了日志監控的功能。
具體如何擴充
efcachingprovider雖從命名上看,是entityframework的緩存擴充包。但它其實是在system.data.common上直接進行擴充。也就是說,隻要與資料庫打交道的應用程式,都可以使用這個擴充包。(可能需要少量修改。)
它使用裝飾模式和抽象工廠,直接繼承了以下ado.net核心對象:dbconnection、dbcommand、dbcommanddefinition、dbproviderfactorybase、dbproviderservicesbase,并命名為***wrapper。以下為dbconnection的擴充:
而裝飾的具體代碼在靜态方法dbconnectionwrapper.wrapconnection中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<code>/// <summary></code>
<code>/// wraps the connection.</code>
<code>/// </summary></code>
<code>/// <param name="connection">the connection.</param></code>
<code>/// <param name="wrapperproviderinvariantnames">the wrapper provider invariant names.</param></code>
<code>/// <returns>wrapped connection.</returns></code>
<code>internal</code> <code>static</code> <code>dbconnection wrapconnection(dbconnection connection,</code><code>params</code> <code>string</code><code>[] wrapperproviderinvariantnames)</code>
<code>{</code>
<code> </code><code>foreach</code> <code>(</code><code>string</code> <code>invariantname</code><code>in</code> <code>wrapperproviderinvariantnames)</code>
<code> </code><code>{</code>
<code> </code><code>dbproviderfactory factory = dbproviderfactories.getfactory(invariantname);</code>
<code> </code><code>var</code> <code>connectionwrapper = factory.createconnection();</code>
<code> </code><code>dbconnectionwrapper wrapper = (dbconnectionwrapper)connectionwrapper;</code>
<code> </code><code>wrapper.wrappedconnection = connection;</code>
<code> </code><code>connection = connectionwrapper;</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>connection;</code>
<code>}</code>
使用方法:
<code>dbconnectionwrapper.wrapconnection(storeconnection,</code>
<code> </code><code>"eftracingprovider"</code><code>,</code>
<code> </code><code>"efcachingprovider"</code>
<code>)</code>
小結
efcachingprovider是一個在system.data.common的裝飾模式擴充包。是以它還可以應用在除了entityframework以外的其它資料庫應用系統中。同時,它支援你在架構的基礎上進行其它的擴充。
如果你的資料庫通路系統需要使用caching、tracing等功能,那你可以嘗試一下使用這個擴充包。 : )