我有一个C#应用程序使用ADO.Net访问特定类型的数据库(VistaDB),我需要扩展它以选择性地使用第二种类型的数据库(SQL Server)。
我无法使用Vista Entity Framework数据访问(可以支持多种数据库类型),因为这需要比我的大多数用户更高版本的.NET框架。我的数据访问函数将VistaDBConnection作为ref参数,虽然我可以重载函数以提供SqlConnection参数支持,但这意味着复制大量的数据访问函数。
我想知道是否可以将函数参数定义为VistaDBConnection或SqlConnection类型,然后测试已传递的类型,并在数据访问例程中提供选项以使用它们。我可以通过将VistaConnection和SqlConnection参数传递给数据访问函数来完成此操作,但传递单个参数或变量类型将更整洁。但是,这确实打破了C#的强类型功能。
答案 0 :(得分:2)
最好的方法是创建接口或基类。然后有两个实现此接口的具体类,一个用于VistaDB,另一个用于SQL Server。然后,您可以使用某种工厂(或依赖注入)在运行时实例化正确的类。然后,所讨论的方法将采用接口/基类的实例,并且不需要知道任何特定的内部工作。例如:
interface IApplicationDatabase
{
Foo GetFoo(int id);
}
class VistaDatabase : IApplicationDatabase
{
public Foo GetFoo(int id)
{
//do VistaDB-specific things to get the Foo
}
}
class SqlServerDatabase : IApplicationDatabase
{
public Foo GetFoo(int id)
{
//do SQL Server-specific things to get the Foo
}
}
class Demo
{
public Foo GetFooFromStorage(int id, IApplicationDatabase storage)
{
//notice here we don't need any separate code depending on the
//concrete type of database
return storage.GetFoo(id);
}
}
答案 1 :(得分:1)
您只需要定义更多泛型类型,或者我们可以说两种连接SQL以及VistaDB连接的父类型如下所示。然后使用as运算符来强制转换并检查null,以检查强制转换是否成功。
public void Connect(DbConnection dbConnection)
{
var sqlDbCon = dbConnection as SQLConnection;
if(con != null)
{
//process here for SQLConnection
}
var vistaDbCon = dbConnection as VistaDbConnection;
if(con != null)
{
//process here for VistaDbConnection
}
}
你不需要在if if中单独执行如果你想要的所有内容在父类中都可用,就像在这种情况下你只想调用connect方法然后你可以像下面这样做,因为它确实有IDbConnection中的connect方法。
public void Connect(IDbConnection dbConnection)
{
dbConnection.Open();
}
它适用于sql server和vistadb。
答案 2 :(得分:0)
这个想法是,不要使用类作为参数的类型,而是使用interface作为参数的类型。 此接口将由您定义,并针对每种类型的连接单独实施。 现在,当您传递实现该接口的任何类的实例时,您的代码将起作用。
使用接口功能调用提供者特定的功能。
其他贡献者添加的前两个代码示例就是正确的示例,使用其中任何一个。