假设我正在设计一个可以处理任何数据库技术的类来创建连接,执行命令和检索数据等.
如果我需要为现有的RDBMS(如SQL Server,Oracle,FireBird等)创建一个通用的数据库处理类,我应该使用.net abstract-class/Interface {DbConnection,DbCommand,DbParameter,...}或{ IDbConnection,IDbCommand,IDbParameter,...}?
我应该使用像这样的代码吗?
public bool CreateConnection(DatabaseTypeEnum type)
{
DbConnection conn ;
if(type==DatabaseTye.Oracle)
{
//....
}
}
public DbDataReader GetData()
{
DbCommand comm;
//...
}
Run Code Online (Sandbox Code Playgroud)
要么,
public bool CreateConnection(DatabaseTypeEnum type)
{
IDbConnection conn ;
if(type==DatabaseTye.Oracle)
{
//....
}
}
public IDbDataReader GetData()
{
IDbCommand comm;
//...
}
Run Code Online (Sandbox Code Playgroud)
而且,为什么?
嗯......完全不同的问题:)
好的,不...
当你这样做时,你将违反开放式关闭原则......那个特定地方的switch/if语句让我感到不舒服:).
我将实际创建保留给Factory类,您的代码不应该关心它是否与SQL Server,DB2或Oracle或其他任何内容进行通信.
理想情况下,您的代码应该只与IDbConnection,IDbCommand等或抽象基类(DbConnection,DbCommand等)通信.有时我确实发现你需要向某个特定的提供者转发(比如SqlDataReader使用特定的方法),但它很少见.
Factory会将此switch/if语句封装到一个位置,以便于维护.您可以在app.config中进一步抽象实际创建.因此,在app.config中,您可以选择支持哪种类型的DB后端,Factory将从那里获取它并为您创建必要的DB内容.
见:这个.阅读有关创建DbProviderFactory和连接部分的信息......
| 归档时间: |
|
| 查看次数: |
14750 次 |
| 最近记录: |