[Spring.Net]不同資料來源的各個專案引用

  • 2479
  • 0

摘要:[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>
  <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>

這是一對一的使用方法
單一專案對多個資料庫的做法在另一篇有解釋了

[Spring.Net]如果連不同機器的DB

那如果是多個專案對單一資料庫的話,
把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>
 

這樣就可以用了,但是這是偷懶的做法
兩個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去連,才不會被取代掉,
其實原理跟連不同資料庫的方法一樣,需要改Provider的名稱
如果沒有改的話,在Spring裡這個ID的Object只有一個,所以B的設定會蓋掉A的,
所以A的Service就會一直發生錯誤了