Castle ActiveRecord学习实践(2):构建配置信息
摘要:ActiveRecord在底層封裝了NHibernate,在框架啟動時需要指定相關的配置信息,那么我們需要配置些什么?又該如何去配置呢?本文將會介紹在ActiveRecord中構建配置信息。
主要內容
1.需要配置什么
2.如何去配置
3.常見的配置示例
?
一.需要配置什么
在第一篇大家都已經看到了,其實我們的配置信息跟用NHibernate時的配置是一樣的,這是因為ActiveRecord在底層封裝了NHibernate。為了沒有用過NHibernate的朋友,這里再把配置信息簡單介紹一下。
1.配置NHibernate ADO.NET屬性
| 屬性名 | 說明 |
| hibernate.connection.provider_class | 定制IConnectionProvider的類型. 例如:full.classname.of.ConnectionProvider (如果提供者創建在NHibernate中), 或者 full.classname.of.ConnectionProvider, assembly (如果使用一個自定義的IConnectionProvider接口的實現,它不屬于NHibernate)。 |
| hibernate.connection.driver_class | 定制IDriver的類型. full.classname.of.Driver (如果驅動類創建在NHibernate中), 或者 full.classname.of.Driver, assembly (如果使用一個自定義IDriver接口的實現,它不屬于NHibernate)。 |
| hibernate.connection.connection_string | 用來獲得連接的連接字符串。 |
| hibernate.connection.isolation | 設置事務隔離級別. 請檢查 System.Data.IsolationLevel 來得到取值的具體意義并且查看數據庫文檔以確保級別是被支持的。 例如: Chaos, ReadCommitted, ReadUncommitted, RepeatableRead, Serializable, Unspecified |
2.可選的配置屬性
除了上面的ADO.NET屬性之外,我們還有如下的可選屬性
| 屬性名 | 說明 |
| hibernate.dialect | NHibernate方言(Dialect)的類名 - 可以讓NHibernate使用某些特定的數據庫平臺的特性 例如: full.classname.of.Dialect(如果方言創建在NHibernate中), 或者full.classname.of.Dialect, assembly (如果使用一個自定義的方言的實現,它不屬于NHibernate)。 |
| hibernate.default_schema | 在生成的SQL中,scheml/tablespace的全限定名. 例如: SCHEMA_NAME |
| hibernate.prepare_sql | 是否準備sql語句 例如: true | false |
| hibernate.session_factory_name | SessionFactory被創建后將自動綁定這個名稱. 例如: some.name |
| hibernate.use_outer_join | 允許使用外連接抓取。 例如:true | false |
| hibernate.cache.provider_class | 指定一個自定義的CacheProvider緩存提供者的類名 例如: full.classname.of.CacheProvider(如果ICacheProvider創建在NHibernate中), 或full.classname.of.CacheProvider, assembly(如果使用一個自定義的ICacheProvider,它不屬于NHibernate)。 |
| hibernate.query.substitutions | 把NHibernate查詢中的一些短語替換為SQL短語(比如說短語可能是函數或者字符)。 例如: hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC |
可以數據庫設置一個hibernate.dialect方言,它是NHibernate.Dialect.Dialect 的一個子類。如果不需要使用基于native或者sequence的主鍵自動生成算法,或者悲觀鎖定(使用ISession.Lock() 或者 IQuery.SetLockMode())的話,方言就可以不必指定。然而,假若你指定了一個方言,Hibernate會為上面列出的一些屬性使用特殊默認值,省得我們手工指定。
NHibernate SQL 方言對照表:
| 數據庫系統 | SQL方言 |
| DB2 | NHibernate.Dialect.DB2Dialect |
| PostgreSQL | NHibernate.Dialect.PostgreSQLDialect |
| MySQL | NHibernate.Dialect.MySQLDialect |
| Oracle (any version) | NHibernate.Dialect.OracleDialect |
| Oracle 9/10g | NHibernate.Dialect.Oracle9Dialect |
| Sybase | NHibernate.Dialect.SybaseDialect |
| Microsoft SQL Server 2000 | NHibernate.Dialect.MsSql2000Dialect |
| Microsoft SQL Server 7 | NHibernate.Dialect.MsSql7Dialect |
| Firebird | NHibernate.Dialect.FirebirdDialect |
?
二.如何去配置
ActiveRecord為我們提供了三種方式的配置
1.XmlConfigurationSource配置
可以使用自己的XML文件來保存配置信息,例如有一個MyConfig.xml的文件
<?xml?version="1.0"?encoding="utf-8"??><activerecord>
????<config>
????????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.SqlClientDriver"?/>
????????<add?key="hibernate.dialect"?value="NHibernate.Dialect.MsSql2000Dialect"?/>
????????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????????<add?key="hibernate.connection.connection_string"?value="Data?Source=.;Initial?Catalog=ARDemo;UID=sa;Password=sa"?/>
????</config>
</activerecord>
?這時候我們在框架初始化的時候就應該這樣寫:
XmlConfigurationSource?source?=?new?XmlConfigurationSource("MyConfig.xml");ActiveRecordStarter.Initialize(source,typeof(ActiveRecordBase));
其中XmlConfigurationSource通過重載提供了如下三個公用的構造函數
public XmlConfigurationSource(String xmlFileName)
public XmlConfigurationSource(Stream stream)
public XmlConfigurationSource(TextReader reader)
不管是以文件名還是Stream形式或者TextReader,在XmlConfigurationSource的內部都會轉換為XmlDocument。最后要注意xml文件的路徑,可以用生成后事件命令拷貝.xml文件到bin目錄下
copy "$(ProjectDir)\*.xml" "$(TargetDir)"
2.InPlaceConfigurationSource配置
這種實現是一種硬編碼的方式,在實際的使用中并不推薦,但是有時候如果我們的配置信息是動態的獲取,則這種方式就會變得非常有用。
InPlaceConfigurationSource?source?=?new?InPlaceConfigurationSource();?
Hashtable?properties?=?new?Hashtable();
?
properties.Add("hibernate.connection.driver_class",?"NHibernate.Driver.SqlClientDriver");
properties.Add("hibernate.dialect",?"NHibernate.Dialect.MsSql2000Dialect");
properties.Add("hibernate.connection.provider",?"NHibernate.Connection.DriverConnectionProvider");
properties.Add("hibernate.connection.connection_string",?"UID=sa;Password=19811218;Initial?Catalog=ARDemo;Data?Source=.");
?
source.Add(?typeof(ActiveRecordBase),?properties?);
?
ActiveRecordStarter.Initialize(?source,?typeof(ActiveRecordBase)?);
3.使用應用程序配置文件
這種方式是最為常見的一種,即使用應用程序的配置文件(Web.config 或者App.config),在配置文件中
<configuration>
????<configSections>
????????<section?name="activerecord"?type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler,?Castle.ActiveRecord"?/>
????</configSections>
????<activerecord>
????????<config>
????????????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.SqlClientDriver"?/>
????????????<add?key="hibernate.dialect"?value="NHibernate.Dialect.MsSql2000Dialect"?/>
????????????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????????????<add?key="hibernate.connection.connection_string"?value="UID=sa;Password=sa;Initial?Catalog=ARDemo;Data?Source=."?/>
????????</config>
????</activerecord>
</configuration>
這時候我們的框架初始化代碼應該這樣寫
?
[.NET1.1]
IConfigurationSource?source?=?System.Configuration.ConfigurationSettings.GetConfig("activerecord")?as?IConfigurationSource;ActiveRecordStarter.Initialize(?source,?typeof(ActiveRecordBase)?);?
[.NET2.0]
ActiveRecordStarter.Initialize(?source,?typeof(ActiveRecordBase)?);
4.在Web應用程序中的配置
如果我們是在Web應用程序中使用ActiveRecord,需要指定isWeb="true",如下
????<config>
????????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.SqlClientDriver"?/>
????????<add?key="hibernate.dialect"?value="NHibernate.Dialect.MsSql2000Dialect"?/>
????????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????????<add?key="hibernate.connection.connection_string"?value="UID=sa;Password=sa;Initial?Catalog=ARDemo;Data?Source=."?/>
????</config>
</activerecord>
一般的初始化工作我們會放在Application_ Start中,示例代碼
?
protected?void?Application_Start(Object?sender,?EventArgs?e){
????IConfigurationSource?source?=?
????????System.Configuration.ConfigurationSettings.GetConfig("activerecord")?as?IConfigurationSource;
?
????ActiveRecordStarter.Initialize(?source,?typeof(ActiveRecordBase));
} ?
三.常見的配置示例
Castle網站為我們提供的幾個常見的配置示例
1.MS SQLServer
????<config>
????????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.SqlClientDriver"?/>
????????<add?key="hibernate.dialect"?value="NHibernate.Dialect.MsSql2000Dialect"?/>
????????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????????<add?key="hibernate.connection.connection_string"?value="Data?Source=.;Initial?Catalog=test;UID=sa;Password=sa"?/>
????</config>
</activerecord>
2.Oracle
????<config>
????????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.OracleClientDriver"?/>
????????<add?key="hibernate.dialect"?value="NHibernate.Dialect.OracleDialect"?/>
????????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????????<add?key="hibernate.connection.connection_string"?value="Data?Source=dm;User?ID=dm;Password=dm;"?/>
????</config>
</activerecord>
3.MySQL
?
<activerecord>????<config>
????????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.MySqlDataDriver"?/>
????????<add?key="hibernate.dialect"?value="NHibernate.Dialect.MySQLDialect"?/>
????????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????????<add?key="hibernate.connection.connection_string"?value="Database=test;Data?Source=someip;User?Id=blah;Password=blah"?/>
????</config>
</activerecord> ?
4.Firebird
?
<activerecord>????<config>
????????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.FirebirdDriver"?/>
????????<add?key="hibernate.dialect"?value="NHibernate.Dialect.FirebirdDialect"?/>
????????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????????<add?key="hibernate.connection.connection_string"?value="Server=localhost;Database=d:\db.fdb;User=SYSDBA;password=masterkey;ServerType=1;Pooling=false"?/>
????????<add?key="hibernate.query.substitutions"?value="true?1,?false?0"?/>
????</config>
</activerecord>
?
5.PostgreSQL
<activerecord>????<config>
????????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.NpgsqlDriver"?/>
????????<add?key="hibernate.dialect"?value="NHibernate.Dialect.PostgreSQLDialect"?/>
????????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????????<add?key="hibernate.connection.connection_string"?value="Server=localhost;initial?catalog=nhibernate;User?ID=nhibernate;Password=nhibernate;"?/>
????</config>
</activerecord>
關于ActiveRecord構建配置信息的介紹就這么多了,內容比較簡單。下篇文章中我會詳細介紹ActiveRecord中的映射,希望研究過Castle的朋友不吝賜教。
?
參考資料
Castle的官方網站http://www.castleproject.org
轉載于:https://www.cnblogs.com/Terrylee/archive/2006/04/05/367381.html
總結
以上是生活随笔為你收集整理的Castle ActiveRecord学习实践(2):构建配置信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于我,十九线程序员小 UP
- 下一篇: 为你做一万次