摘要:[Spring.Net]不同資料來源的各個專案引用
通常利用Spring.Net把DAL切離出來會做成一個專案
連接單一資料庫
要使用此DAL再引用此專案進來
我用Spring的config來解釋一下
使用的專案設定如下:
<spring>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />
</parsers>
<context>
<resource uri="assembly://A/A.SpringConfig/Objects.xml" />
</spring>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />
</parsers>
<context>
<resource uri="assembly://A/A.SpringConfig/Objects.xml" />
</spring>
<databaseSettings>
<!--本機DB-->
<add key="db.datasource" value="127.0.0.1" />
<add key="db.user" value="sa" />
<add key="db.password" value="1234" />
<add key="db.database" value="A" />
</databaseSettings>
<!--本機DB-->
<add key="db.datasource" value="127.0.0.1" />
<add key="db.user" value="sa" />
<add key="db.password" value="1234" />
<add key="db.database" value="A" />
</databaseSettings>
Spring的設定如下:(只貼重點)
<db:provider id="DbProvider"
provider="SqlServer-2.0"
connectionString="Server=${db.datasource};Database=${db.database};User ID=${db.user};Password=${db.password};"/>
<object id="adoTemplate" type="Spring.Data.Core.AdoTemplate, Spring.Data">
<property name="DbProvider" ref="DbProvider"/>
<property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
<property name="CommandTimeout" value ="1800" />
</object>
provider="SqlServer-2.0"
connectionString="Server=${db.datasource};Database=${db.database};User ID=${db.user};Password=${db.password};"/>
<object id="adoTemplate" type="Spring.Data.Core.AdoTemplate, Spring.Data">
<property name="DbProvider" ref="DbProvider"/>
<property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
<property name="CommandTimeout" value ="1800" />
</object>
這是一對一的使用方法 單一專案對多個資料庫的做法在另一篇有解釋了
那如果是多個專案對單一資料庫的話,
把DAL切成多個專案的話,Spring的設定不需要改
引用的專案要改成
<spring>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />
</parsers>
<context>
<resource uri="assembly://A/A.SpringConfig/Objects.xml" />
<resource uri="assembly://B/B.SpringConfig/Objects.xml" />
</context>
</spring>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />
</parsers>
<context>
<resource uri="assembly://A/A.SpringConfig/Objects.xml" />
<resource uri="assembly://B/B.SpringConfig/Objects.xml" />
</context>
</spring>
這樣就可以用了,但是這是偷懶的做法
兩個DAL的專案都是複製過來的,objects.xml裡有許多同名的Object沒有區別開來,
這樣很容易弄混而發生錯誤。
當遇到兩個不同資料庫又各自獨立的DAL專案要引用進來時
問題就出現了,
出現的狀況是B的Service都沒問題,A的Service一直叫找不到某個Table,
直覺是設定問題,看了很久設定都是正確的,
後來想到會不會是Provider的問題,因為狀況看起來像是都導到同一個資料庫,
後來找出元兇了,是B的Objects.XML沒有設定好,把Provider改成下面這樣
<db:provider id="lfDbProvider"
provider="SqlServer-2.0"
connectionString="Server=${lfdb.datasource};Database=${lfdb.database};User ID=${lfdb.user};Password=${lfdb.password};"/>
<object id="lfadoTemplate" type="Spring.Data.Core.AdoTemplate, Spring.Data">
<property name="DbProvider" ref="lfDbProvider"/>
<property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
<property name="CommandTimeout" value ="1800" />
</object>
provider="SqlServer-2.0"
connectionString="Server=${lfdb.datasource};Database=${lfdb.database};User ID=${lfdb.user};Password=${lfdb.password};"/>
<object id="lfadoTemplate" type="Spring.Data.Core.AdoTemplate, Spring.Data">
<property name="DbProvider" ref="lfDbProvider"/>
<property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
<property name="CommandTimeout" value ="1800" />
</object>
因為是用複製過來的,就沒有考慮到不同資料庫要用不同Provider去連,才不會被取代掉,
其實原理跟連不同資料庫的方法一樣,需要改Provider的名稱
如果沒有改的話,在Spring裡這個ID的Object只有一個,所以B的設定會蓋掉A的,
所以A的Service就會一直發生錯誤了