2015-02-24 61 views
0

我有一个C#应用程序使用ADO.Net访问特定类型的数据库(VistaDB),我需要扩展到可选使用第二种类型的数据库(SQL Server)。是否有可能绕过C#函数参数强打字?

我无法使用Vista Entity Framework数据访问(可支持多种数据库类型),因为这需要更高版本的.NET框架,而不是我的大多数用户可用的版本。我的数据访问函数将VistaDBConnection作为参数参数,虽然我可以重载函数以提供SqlConnection参数支持,但这意味着需要复制大量的数据访问函数。

我想知道是否有可能将函数参数定义为VistaDBConnection或SqlConnection类型,然后测试哪种类型已通过并提供数据访问例程中的选项以使用。我可以通过将VistaConnection和SqlConnection参数传递给数据访问函数来做到这一点,但传递单个参数或变量类型会更简洁。但是,这确实打破了C#强大的打字功能。

回答

1

你只需要定义更通用的类型,或者我们可以说双连接SQL的父类型以及像下面这样的VistaDB连接。然后用作操作符来投射并检查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 
    } 

} 

你不需要做单独实施,如果其他人,如果你想要的是可以在父类像在这种情况下,如果你只是想调用connect方法,那么你可以像下面的,因为它在IDbConnection中有连接方法。

public void Connect(IDbConnection dbConnection) 
{ 
    dbConnection.Open(); 
} 

它会在SQL Server和vistadb的情况下工作。

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); 
    } 
}   
0

这个想法是,而不是使用类作为参数的类型,使用接口作为参数的类型。 此接口将由您定义并针对每种连接类型单独实施。 现在,当您传递实现接口的任何类的实例时,您的代码将工作。

使用接口函数调用提供特定的功能。其他贡献者加入

上一页两个代码示例是针对正确的示例,使用其中任何一个。

相关问题