HKH小类库系列(一) 数据库访问层设计思路及使用方法
曾经做过一个要求跨库访问的项目,在当时1。1版本时就出来了这个设计,现在进行了重构,发出来与大家共享:
一、设计思路(面向接口编程,中间夹杂着工厂和创建者模式)
整体类关系图:(忽略中间的部分抽象类,主要是思想描述)
其中左边DataProvider系列接口和类是对外提供数据访问接口的,里面提供了大量的ExecuteNonQuery,ExecuteDataReader等各种数据访问方法的重载,
右边的DbObjectBuilder系列接口和类是构建Connection,Command等数据库访问对象的,提供给DataProvider来使用,我们可以通过实现IDataProviderObjectBuilder来支持其它的数据库,比如Oracle和MySql。
其中使用何用数据库是在配置文件中指定的,示例如下
<section name="dataProviderConfigurations" type="HKH.DataProvider.Configuration.DataProviderConfigurationSectionHandler,HKH.DataProvider"></section>
</configSections>
<dataProviderConfigurations>
<dataProviderConfiguration name="sqlConn" builder="HKH.DataProvider.SqlServer.SqlServerObjectBuilder,HKH.DataProvider" default="true">
<param name="ConnectionString" value="A8C565FE2A93B932AC934D03DDF5485276DA60475F2DD479864F3EEEFD07B5BFC7E815031AEC3F0692AD5F563126ADB49DC6F7450DD975776208966B8499C749FF67B9639CE88CB7DFEB7EDDDCD6B445B54FAF93CBFD8AAC4BAC6D0C15A804C4355F2413EA2C445345ADC5B1BB27D822" encrypt="true"/>
<!--<param name="ConnectionString" value="Data Source=192.168.8.106\SqlExpress;Initial Catalog=NUnit;User ID=sa;Password=sa;Integrated Security=false;" encrypt="false"/>-->
<!--<param name="Data Source" value="192.168.8.106\SqlExpress" />
<param name="Initial Catalog" value="NUnit" />
<param name="User ID" value="sa" />
<param name="Password" value="sa" />
<param name="Integrated Security" value="false" />
<param name="Connect Timeout" value="60" />
<param name="EnList" value="false" />-->
</dataProviderConfiguration>
</dataProviderConfigurations>
首先是自定义配置节处理程序配置,接下来就是连接字符串配置,其中Builder属性要求提供DbObjectBuilder类,格式"ClassName,AssemblyName",
Default属性指定当我们在程序不提定配置名时,将返回此连接,下边是连接参数配置,三种选择:
1。逐个参数配置,
2。连接字符串配置
3。混合使用
encrypt属性,连接字符串/参数值是否被加密,加密使用AES算法 至于加密K和V,可以去源代码AesDbEncryption类中修改,DBEncryptTool可以帮助生成加密字符串
二、使用方法
DataProviderFactory类的方法GetDataProvider()方法将返回IDataProvider对象供外部访问数据库,在其不同重载函数中需要注意的是:如果你传进去的参数是一个在config文件配置好的,该对象在创建后将被缓存;如何传的参数是一个完整的连接字符串,该对象将不会被缓存,因为某些时候我们只想访问一次数据库。
TransactionHelper类封装了事务处理,可以方便的处理事务启动和回滚。使用方法如下:
using (TransactionHelper helper = new TransactionHelper(transaction))
{
provider.ExecuteNonQuery("sql1", helper.Transaction);
provider.ExecuteNonQuery("sql2",helper.Transaction);
helper.TryCommitTransaction();
}
我们只要将TransactionHelper类的Transaction属性做为事件在方法间传递,并在最后执行TryCommitTransaction方法即可,如果方法执行成功,在最后就会被提交,如果方法有异常产生,在using结束时,事务会被执行回滚。
众多接口,可能有过度设计之嫌,但使用一直良好,众位高手有何意见或建议请留言赐教。
框架下载地址:
HKH类库:/Files/Jackyli/HKHProjects.rar