关于ADO.NET设计模型上的困惑?
我刚刚接触ADO.NET,对这个新的数据访问模型的设计思路有一些疑惑,希望已经体会到其中真味的朋友给点指点。
ADO.NET为什么没有像ADO一样提供一组"接口模型",而是直接把类暴露给开发者。这样一来,我们写的程序不得不针对不同数据库"硬编码",就像:
OracleConnection conn;
OracleCommand cmd;
...
SqlConnection conn;
SqlCommand cmd;
然而以上代码,除了类名不同以外,语句基本上没什么区别,类似如下:
conn.open();
reader = cmd.executeReader(...)
...
conn.Close();
虽然只有类名不同,但是为了支持不同的数据库,代码也要被迫写多遍。而原来的ADO则不强迫你硬编码数据库的类型,只是在ConnnectionString的provider中设的OLEDB的driver不同。ADO.NET为什么不再多加入一个类似JDBC中的DriverManager类,输入不同的Provider字符串返回具体connection类的接口呢。.NET具有那么强大的Assembly动态分析加载功能,做这个不是小菜一碟吗?
当然,针对不同数据库,Data Access Layer的类实现起来肯定会不一样的,尽量发挥而不是抹煞各个数据库的特色,是Data Access Layer的职责。那么针对Oracle的实现里用OracleConntion...,针对SqlServer的实现用SqlConntion如此这般就成了顺理成章的事,即使在接口模型上统一了代码,到具体实现还是要分开(比如SQL语句不同,表的设计不同),那上面说的接口模型好像意义也不大了,PetShop3和Duwamish就是这么设计的DAL。可是这里有一个问题,就是选择设计模型的自由没有了,你被强迫使用区别对待的模型(ADO.NET),而不能用风格统一的接口模型(像ADO,JDBC的模型),而后者的自由在于你即可以用统一风格也可以区别对待。比如,SQL Server的日期字段是这样操作:
... WHERE create_date='2003-07-08'
Oracle的是这样
... WHERE create_date=to_date('2003-07-08','yyyy-mm-dd')
假如对这个字段的操作只有写入和取出打印,那我就想模糊这种区别,统一用varchar。
在ADO.NET中你就没的选择,只有写两遍:
OracleConnection conn...
SqlConnection conn...
而在ADO或JDBC中你只需写一遍:
Connection conn
以前用MFC,ATL以及其它的MS的framework时,总感觉不是特别舒服,觉得微软的东西挺实用,但在设计上总是差了那么一点。现在推出的.NET是微软精心打造的,说是为了未来十年设计的.ADO.NET又是重新设计的,可是,不会在现在开发中就这么不顺手吧。
盼望高人指点