天天看點

資料層擴充包EFCachingProvider 總結

總體描述

    園子文章的圖中,畫出了efcachingprovider所擴充的位置:

資料層擴充包EFCachingProvider 總結

    也就是說,entityconnection不是直接使用sqlclient中間的sqlconnection,而是通過efcachingprovider把指令轉換後,再使用sqlclient執行。

解決方案結構

資料層擴充包EFCachingProvider 總結

    重點工程解釋: 

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的擴充:

資料層擴充包EFCachingProvider 總結

而裝飾的具體代碼在靜态方法dbconnectionwrapper.wrapconnection中:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<code>/// &lt;summary&gt;</code>

<code>/// wraps the connection.</code>

<code>/// &lt;/summary&gt;</code>

<code>/// &lt;param name="connection"&gt;the connection.&lt;/param&gt;</code>

<code>/// &lt;param name="wrapperproviderinvariantnames"&gt;the wrapper provider invariant names.&lt;/param&gt;</code>

<code>/// &lt;returns&gt;wrapped connection.&lt;/returns&gt;</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等功能,那你可以嘗試一下使用這個擴充包。 : )