实现应用程序数据访问层计划
2021-08-24 淮安装修公司
规则5:抽象化.NET Framework data provider
最后一个规则指定,为什么应该对在DAL内部使用的.NET Framework data provider抽象化,以及应该如何进行抽象。正如我已经提到的那样,编程模型公开了独特的.NET Framework data provider,包括SqlClient、OleDb和其他可从 MSDN Web站点上获得的data provider。尽管该设计能够提高性能,并且使provider能够公开特定于数据源的功能(例如SqlCommand对象的ExecuteXmlReader方法),但它会迫使开发人员决定针对哪个provider进行编码。换句话说,开发人员通常选择使用SqlClient或OleDb,然后直接针对各个命名空间中的类编写代码。
public enum ProviderType : int {SqlClient = 0, OLEDB = 1}
public class ProviderFactory {
public ProviderFactory(ProviderType provider) {
_pType = provider;
_initClass();
}
public ProviderFactory() {
_initClass();
}
private ProviderType _pType = lClient;
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];
北京市的特种设备数量每年以两万余台的速度增长 // Initialize the types for the providers
_conType[(int)lClient] = typeof(SqlConnection);
_conType[(int)EDB] = typeof(OleDbConnection);
_comType[(int)lClient] = typeof(SqlCommand);
_comType[(int)EDB] = typeof(OleDbCommand);
_parmType[(int)lClient] = typeof(SqlParameter);
_parmType[(int)EDB] = typeof(OleDbParameter);
_daType[(int)lClient] = typeof(SqlDataAdapter);
_daType[(int)EDB] = typeof(OleDbDataAdapter);
}
public ProviderType Provider {
get {
return _pType;
}
set {
if (_pTypeSet) {
throw new ReadOnlyException(\"Provider already set to \" + _String());
}
else {
_pType = value;
_pTypeSet = true;
}
}
}
public IDataAdapter CreateDataAdapter(string commandText,IDbConnection connection) {
IDataAdapter d;
IDbDataAdapter da;
d = (IDataAdapter)eateInstance(_daType[(int)_pType], false);
da = (IDbDataAdapter)d;
lectCommand = eateCommand(commandText, connection);
return d;
}
public IDataParameter CreateParameter(string paramName, DbType paramType) {
IDataParameter p;
p = (IDataParameter)eateInstance(_parmType[(int)_pType], false);
rameterName = paramName;
Type = paramType;
return p;
}
public IDataParameter CreateParameter(string paramName, DbType paramType, Object value) {
IDataParameter p;
p = (IDataParameter)eateInstance(_parmType[(int)_pType], false);
rameterName = paramName;
Type = paramType;
lue = value;
return p;
}
public IDbConnection CreateConnection(string connect) {
IDbConnection c;
c = (IDbConnection)eateInstance(_conType[(int)_pType], false);
nnectionString = connect;
return c;
}
public IDbCommand CreateCommand(string cmdText, IDbConnection connection) {
IDbCommand c;
c = (IDbCommand)eateInstance(_comType[(int)_pType], false);
mandText = cmdText;
nnection = connection;
return c;
}
} 图7 Provider Factory
如果您要更改.NET Framework data provider,则需要重新编写数据访问方法的代码。为了避免这种情况,可以使用称为“抽象工厂(Abstrace Factory)”的设计模式。使用该模式,可以生成一个简单的类,该类将公开能够基于标识传入到构造函数的.NET Framework data provider的信息来创建主要的.NET Framework data provider对象(命令、连接、数据适配器和参数)的方法。图7中的代码显示了该类的一个简化的C#版本。为了使用该类,数据访问类中的代码需要针对.NET Framework data provider实现的各种接口(包括IDbCommand、IDbConnection、IDataAdapter和IDataParameter)进行编程。例如,为了用来自参数化存储过程的结果填充DataSet,您可以在数据访问类的方法内部使用以下代码:
Dim _pf As New ProviderFactory(lClient)
Dim cn As IDbConnection = _eateConnection(_connect)
Dim da As IDataAdapter = _eateDataAdapter(\"usp_GetBook\", cn)
Dim db As IDbDataAdapter = CType(da, IDbDataAdapter)
mandType = oredProcedure
d(_eateParameter(\"@productId\", _
32, id))
Dim ds As New DataSet(\"Books\")
ll(ds)
通常,您需要在类级别声明ProviderFactory变量,并且在数据访问类的构造函数中将其实例化。另外,就像这里显示的那样,它的构造函数将用从配置文件中读取的data provider填充,而不是硬编码。如您想像的那样,将ProviderFactory添加到DAL基类中会非常美妙,然后可以将它包含在程序集中并分发给其他开发人员。您还可以更深入一步,以封装开发人员反复编写的常见代码。实际上,Microsoft已经发布了一个能够为SQL Server执行该功能的数据访问应用程序块(参见《Data Access Application Block Overview》, )。
小结
身处于Web Service时代之中,我们会构建越来越多的应用程序—从独立的应用层来操纵数据。如果您遵循某些基本规则并最终将其作为一种习惯,那么编写数据访问代码会变得更快、更容易并且代码也会具有更高的可重用性,从而节省了与服务器之间的交互并使您在代码中保持数据的独立。查看本文来源
吃什么可以补气腹泻有什么症状
重庆妇科习惯性流产治疗多少钱

-
-
英超神吐槽阿森纳曼联羞死切尔西论豪门新标搭配
英超神吐槽!阿森纳曼联羞死切尔西 论豪门新标准英超回来了,还是熟悉的味...
- 装修施工 2020-05-31
-
英超神吐槽阿森纳曼联羞死切尔西论豪门新标搭配
-
-
短道队赴美集训武大靖曲春雨共庆生日搭配
短道队赴美集训 武大靖曲春雨共庆生日前言:有许多人关心,前往美国集训...
- 装修施工 2020-05-29
-
短道队赴美集训武大靖曲春雨共庆生日搭配
-
-
三十年老房翻新现代简约照亮四世同堂搭配
三十年老房翻新,现代简约照亮四世同堂!基本信息位置:北京面积:132㎡户型...
- 装修施工 2020-05-29
-
三十年老房翻新现代简约照亮四世同堂搭配
-
-
两弃将轮流暴走打脸雷管谁还说步行者石乐志搭配
两弃将轮流暴走打脸雷管 谁还说步行者石乐志?奥拉迪波与萨博尼斯在雷霆换...
- 装修施工 2020-05-28
-
两弃将轮流暴走打脸雷管谁还说步行者石乐志搭配
-
-
钢炮高效率猛龙人上双格里芬分快船被掀翻搭配
钢炮高效率猛龙人上双 格里芬分快船被掀翻格里芬18分快船被猛龙掀翻 ...
- 装修施工 2020-05-27
-
钢炮高效率猛龙人上双格里芬分快船被掀翻搭配
-
-
深度死亡秒定赛季成败年后他们回来了搭配
深度|死亡秒定赛季成败 年后!他们回来了唐斯怒吼赛前可能连摇头都做不到的...
- 装修施工 2020-05-27
-
深度死亡秒定赛季成败年后他们回来了搭配