用Nhibernate有近一年了,把最近的一個項目例子發上來,想學Nh的可以下載參考。
還包含操作Ser和Radius的方式,映射複合主鍵,guid主鍵
程式碼封裝含三個項目:
1、NhibernateService,封裝了NhFactory,NHSession。可以很簡單的增加其他的資料庫。目前串連了兩個MySql資料庫,一個SqlServe
增加新的資料庫:
添加一個類:簡單的繼承SessionFactory就可以了,如下面增加一個串連Ser的庫:
class SerSessionFactory:SessionFactory
{
public static readonly SessionFactory _sessionFactory = new SerSessionFactory();
protected SerSessionFactory()
: base("Ser.cfg.xml")
{
}
}
添加設定檔:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.0">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
<property name="connection.connection_string">Server=203.193.42.37;initial catalog=radius;uid=**;pwd=**</property>
<property name="show_sql">false</property>
<property name="dialect">NHibernate.Dialect.MySQLDialect</property>
<!--<property name="use_outer_join">true</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>-->
<mapping assembly="LoginBase" />
</session-factory>
</hibernate-configuration>
然後就可以通過Repository操作資料庫了
Repository簡單的封裝了NhSession,可以操作所有配置好的資料庫。主要參考了Cuyahoga的實現。如果是Web項目可以參考:http://bluewater.cnblogs.com/archive/2006/05/29/412254.html
2、LoginBase 為LoginService提供類庫,用NhibernateService提供的庫操作Ser,Radius和一個Sqlserver。因為LoginServie要求很高的靈活性
這個項目應用了大量的設定檔。包括login.config,errMessage.config,log4net.config,ser.cfg.xml,login.cfg.xml,radius.cfg.xml
通過用序列化實現設定檔和類的轉化,代碼簡化了很多,靈活性不如直接用XMl方式讀取。總結三種設定檔的操作方式:
1,用xmlspy等工具產生xsd,再用xsd.exe產生類,最為簡便
2,自己些xml和類用序列化轉換
3,自己寫xml,類通過xmlreader讀取轉換到類,最靈活。可以實現序列化不能實現的許多功能,如HashTable。見我的http://bluewater.cnblogs.com/archive/2006/05/25/408844.html
這個項目採用了第二種,通過xmlattribute的使用,可以帶來些許靈活性。
異常和錯誤處理:
這個項目在這方面並不完善,主要是對什麼時候用Exception什麼時候用錯誤碼什麼時候用Is之類的檢測函數還很疑惑。
用錯誤碼:1、效率會好點,可是如過客戶沒有Swich一個返回碼回出現許多錯誤。
2、不容易找到錯誤發生的原因,因為在調用過程中會隱藏調一些傳回值,加上錯誤碼本身帶的資訊量就少。可以增加Log
3、有些程式用返回碼會增加很多複雜性
以前的項目幾乎每個都要返回碼,遇到了大量的問題。
總監也說了好多錯誤碼的優點,還有些應用,不過我還是認為不到必須,就用異常。
這次的異常處理結構:
定義包含異常資訊的類:LoginException這個類並沒有繼承任何.net Exception.因為有些用戶端是檢測不到SoapException的,分析<fault>也不方便。
定義傳回值類:UserInfo繼承了LoginException。繼承會帶來編碼上的方便,雖然看起來不合理。用戶端可以通過UserINfo取到錯誤資訊和傳回值,自己決定是否傳回值合法。
這個項目在LoginBase中是不應該返回UserInfo的,這樣做並不合理。我覺得應該在LoginService中提供UserInfo返回。
希望都說一下錯誤處理的方式,我感覺還是很疑惑的。很難找到一種完美的解決方式。
Is**之類的測試函數也提供了很多方便。
3、LoginService 簡單的服務調用
4、LoginTest,沒有什麼東西,只有很少的測試案例,這個項目用的vs 自己帶的單元測試,感覺比Nunit差好多。
:
http://www.cnblogs.com/files/bluewater/login.rar
代碼種不合理的地方請大家指正