设计.NET应用程序数据访问层五大原则 4
点击次数:24 次 发布日期:2008-11-26 10:38:20 作者:源代码网
|
源代码网推荐 源代码网推荐 最后一条规则说明了为什么和怎样抽象数据访问类内部使用的.NET框架组件数据提供程序(data provider)。先前我说过ADO.NET编程模型暴露了特定的.NET框架组件数据提供程序,包括SqlClient、OleDb和其它MSDN Online Web站点上可用的。但是这种设计的结果是提高性能,为数据提供程序暴露特定数据源功能的能力,它强迫你决定使用那种数据提供程序编码。换句话说,开发人员典型地会选择使用SqlClient或OleDb,接着在各自的名字空间直接对它们的类进行编程。 源代码网推荐 源代码网推荐 如果你想改变.NET框架组件数据提供程序,你必须重新编写数据访问方法。为了避免这种情况发生,你可以使用Abstract Factory设计模式。使用这种模式,你能建立一个简单的类,它暴露方法来建立主要的.NET框架组件数据提供程序对象(command、connection、data adapter和parameter),而那些对象基于传递给构造函数的.NET框架组件数据提供程序的信息。列表7中的代码就是这样一个简单的类。 源代码网推荐 源代码网推荐 源代码网推荐 public enum ProviderType :int {SqlClient = 0, OLEDB = 1} 源代码网推荐 源代码网推荐 public class ProviderFactory { 源代码网推荐 public ProviderFactory(ProviderType provider) { 源代码网推荐 _pType = provider; 源代码网推荐 _initClass(); 源代码网推荐 } 源代码网推荐 源代码网推荐 public ProviderFactory() { 源代码网推荐 _initClass(); 源代码网推荐 } 源代码网推荐 源代码网推荐 private ProviderType _pType = ProviderType.SqlClient; 源代码网推荐 private bool _pTypeSet = false; 源代码网推荐 private Type[] _conType, _comType, _parmType, _daType; 源代码网推荐 源代码网推荐 源代码网推荐 private void _initClass() { 源代码网推荐 _conType = new Type[2]; 源代码网推荐 _comType = new Type[2]; 源代码网推荐 _parmType = new Type[2]; 源代码网推荐 _daType = new Type[2]; 源代码网推荐 源代码网推荐 // 为提供程序初始化类型 源代码网推荐 _conType[(int)ProviderType.SqlClient] = typeof(SqlConnection); 源代码网推荐 _conType[(int)ProviderType.OLEDB] = typeof(OleDbConnection); 源代码网推荐 _comType[(int)ProviderType.SqlClient] = typeof(SqlCommand); 源代码网推荐 _comType[(int)ProviderType.OLEDB] = typeof(OleDbCommand); 源代码网推荐 _parmType[(int)ProviderType.SqlClient] = typeof(SqlParameter); 源代码网推荐 _parmType[(int)ProviderType.OLEDB] = typeof(OleDbParameter); 源代码网推荐 _daType[(int)ProviderType.SqlClient] = typeof(SqlDataAdapter); 源代码网推荐 _daType[(int)ProviderType.OLEDB] = typeof(OleDbDataAdapter); 源代码网推荐 } 源代码网推荐 源代码网推荐 public ProviderType Provider { 源代码网推荐 get { 源代码网推荐 return _pType; 源代码网推荐 } 源代码网推荐 set { 源代码网推荐 if (_pTypeSet) { 源代码网推荐 throw new ReadOnlyException("Provider already set to " 源代码网推荐 + _pType.ToString()); 源代码网推荐 } 源代码网推荐 else { 源代码网推荐 _pType = value; 源代码网推荐 _pTypeSet = true; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 public IDataAdapter CreateDataAdapter(string commandText,IDbConnection 源代码网推荐 connection) { 源代码网推荐 IDataAdapter d; 源代码网推荐 IDbDataAdapter da; 源代码网推荐 源代码网推荐 d = (IDataAdapter)Activator.CreateInstance(_daType[(int)_pType], 源代码网推荐 false); 源代码网推荐 da = (IDbDataAdapter)d; 源代码网推荐 da.SelectCommand = this.CreateCommand(commandText, connection); 源代码网推荐 return d; } 源代码网推荐 源代码网推荐 public IDataParameter CreateParameter(string paramName, DbType 源代码网推荐 paramType) { 源代码网推荐 IDataParameter p; 源代码网推荐 p = (IDataParameter)Activator.CreateInstance(_parmType[(int)_pType], 源代码网推荐 false); 源代码网推荐 p.ParameterName = paramName; 源代码网推荐 p.DbType = paramType; 源代码网推荐 return p; 源代码网推荐 } 源代码网推荐 源代码网推荐 public IDataParameter CreateParameter(string paramName, DbType 源代码网推荐 paramType, Object value) { 源代码网推荐 IDataParameter p; 源代码网推荐 p = (IDataParameter)Activator.CreateInstance(_parmType[(int)_pType], 源代码网推荐 false); 源代码网推荐 p.ParameterName = paramName; 源代码网推荐 p.DbType = paramType; 源代码网推荐 p.Value = value; 源代码网推荐 return p; 源代码网推荐 } 源代码网推荐 源代码网推荐 public IDbConnection CreateConnection(string connect) { 源代码网推荐 IDbConnection c; 源代码网推荐 c = (IDbConnection)Activator.CreateInstance(_conType[(int)_pType], 源代码网推荐 false); 源代码网推荐 c.ConnectionString = connect; 源代码网推荐 return c; 源代码网推荐 } 源代码网推荐 源代码网推荐 public IDbCommand CreateCommand(string cmdText, IDbConnection 源代码网推荐 connection) { 源代码网推荐 IDbCommand c; 源代码网推荐 c = (IDbCommand)Activator.CreateInstance(_comType[(int)_pType], 源代码网推荐 false); 源代码网推荐 c.CommandText = cmdText; 源代码网推荐 c.Connection = connection; 源代码网推荐 return c; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 列表7. ProviderFactory 源代码网推荐 源代码网推荐 源代码网推荐 为了使用该类,数据访问类的代码必须对多个.NET框架组件数据提供程序实现的接口(包括IDbCommand、IDbConnection、IDataAdapter和IDataParameter)进行编程。例如,为了使用一个参数化存储过程的返回值来填充数据集,必须在数据访问类的某个方法中有下面的代码: 源代码网推荐 源代码网推荐 源代码网推荐 Dim _pf As New ProviderFactory(ProviderType.SqlClient) 源代码网推荐 Dim cn As IDbConnection = _pf.CreateConnection(_connect) 源代码网推荐 Dim da As IDataAdapter = _pf.CreateDataAdapter("usp_GetBook", cn) 源代码网推荐 源代码网推荐 Dim db As IDbDataAdapter = CType(da, IDbDataAdapter) 源代码网推荐 db.SelectCommand.CommandType = CommandType.StoredProcedure 源代码网推荐 db.SelectCommand.Parameters.Add(_pf.CreateParameter("@productId",DbType.Int32, id)) 源代码网推荐 源代码网推荐 Dim ds As New DataSet("Books") 源代码网推荐 da.Fill(ds) 源代码网推荐 源代码网推荐 源代码网推荐 典型的情况是你在类的层次声明ProviderFactory变量并在数据访问类的构造函数中实例化它。另外,它的构造函数与从配置文件中读取的提供程序一起组装,而不应该是硬代码。你可以想象,ProviderFactory是数据访问类的一个重大的补充,并且能被包括进部件,分发给其它的开发人员。 源代码网推荐 源代码网推荐 结论 源代码网推荐 源代码网推荐 在Web服务时代将建立越来越多的应用程序操作来自独立的应用程序层的数据。如果你遵循一些基本规则并形成习惯,编写数据访问代码将更快、更容易,并且更能重新使用,把你的错误保存到服务器,允许你保持数据独立。 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
