這一篇,其實很上一篇有比較緊密的關聯。
我們把資料關聯和定義儲存在Data層
所以,我們需要從這個Data層裡面擷取我們想要的資訊,然後把資料當作參數傳入。
目前,完整測試過的是SQLServer , 而Oracle/ISeries還沒有完整的測試過,所以想接下來把架構公開了。
廢話少說,接著講如何?這個層。
首先,我們要支援三種資料庫,那麼我們當然期望能夠在今後的使用中,通過內建的設定檔設定,然後只需要依據名字既可擷取資料訪問器
。
So ,第一步,我們得有一個架構內部的設定檔,一個內嵌資源,編譯後存入dll中。
我叫它Wildfish.config.xml
結構是
<configuration>
<DataAccessSection>
<DataAccessProviders>
<DataAccessProvider>
<Name>FishSky</Name>
<DataAccessNameSpace>FishSky.DataAccess.Base.MsSql</DataAccessNameSpace>
<DataSource>(local)</DataSource>
<Category>FishSky</Category>
<UserID>sa</UserID>
<Password>fishsky</Password>
<TestingCategory>FishSky</TestingCategory>
<IsTesting>false</IsTesting>
</DataAccessProvider>
而你所要做的就是,copy一個,然後修改 name namespace datasource category userid password testingcategory istesting的值
name就是到時候用來建立資料訪問源的
namespace就是資料訪問器所在的命名空間,如果用sqlserver就用MsSql 否則 Oracle ISeries
datasource一般用於標註database server ip/name
category用於表示資料庫的名字,Iseries的時候是一個資料庫的library list。--istesting=false的時候
userid password就不用說了
testingcategory 表示istesting=true的時候,指向那個資料庫,Iseries的時候是指向一個測試的庫列表,only for sqlserver iseries
oracle需要在這裡重新寫測試的database server ip/name
istesting 表示是否屬於測試的時候用的dll.
第二步:
由於我們把配置資訊存入一個嵌入資源,那麼我們就需要dll運行時擷取它,
通過一個抽象基類的singleton方法來擷取,在AbstractConnectionBuilder.cs檔案中。
然後我們定義了一些操作的介面,為每一個資料庫類型都做一份,
這裡我承認我沒做太多的重構,所以存在蠻多可改的地方。
還有,還得說明的就是為什麼只作了sqlserver iseries oracle的資料訪問器,因為這些sql的參數表達都是類似的,除了oracle需要用:,
當然了,我們還是按照@來寫,只是提交的時候替換成: 。只有這樣才能做到比較平滑的切換。
資料訪問器區分為三種,操作資料 唯讀訪問資料 單行訪問資料
具體的實現就是 訪問我們在data定義的元資訊,然後產生SQL 組合參數,說白了也就是那樣。
第三步
如果增加一種資料類型,就必須事先那些介面,同時還必須修改commoninfo.cs updateobject deleteobject的方法,耦合度比較大
這也是目前比較鬱悶的地方。
還有就是如果介面的方法的增加,就必須修改三個命名空間下所有涉及到的東西,煩,亦是無可奈何的事情
第四步:
如果使用的話,我們都是需要用DataAccessFactory.CreateDataAccess等等方法來返回那些介面
一切都是依據介面,對於程式的可遷移性會好很多。