打开不同的方法,但使用相同的名称 - C#

时间:2011-12-12 03:02:04

标签: c# php mysql sql-server methods

我意识到标题可能非常令人困惑,所以为了解释我想做什么,我将说明如何在PHP中轻松解决同样的问题。

E.g。我为我的应用程序的用户提供了一个选择数据库类型(即MySQL,MSSQL等)。

在我的代码中,我希望每个操作只有一个函数,而不是每个数据库的函数,如下所述。

不会

main.php

<?php
function mysql_get_users() {
  //Foo
}

function mssql_get_users() {
  //Foo
}

if($dbtype == "mysql") {
  echo mysql_get_users();
}

if($dbtype == "mssql") {
  echo mssql_get_users();
}

?>

BUT

main.php

<?php
if($dbtype == "mysql") {
  include("mysql.php");
}

if($dbtype == "mssql") {
  include("mssql.php");
}
echo get_users();
?>

mysql.php

<?php
function get_users() {
  //Foo
}
?>

mssql.php

<?php
function get_users() {
  //Foo
}
?>

现在我遇到了同样的问题,但在使用Visual Studio 2010的C#中。由于我不能这样做:

 if(dbtype=="mysql") {
    public static MySqlConnection connect(String connectionString)
    {
        MySqlConnection connection = new MySqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}

上面的一个大问题尤其是我不能在方法(函数)周围放置一个if子句,然后我必须面对每个数据库类型所特有的类型的问题,而我必须这样做在与数据库函数相关的每个方法中包含返回的连接变量。

那么,有关如何修复此问题并使其像上面的PHP示例一样工作的任何想法?我既不是C#的专家也不是新手,但我学得很快。

4 个答案:

答案 0 :(得分:5)

您需要研究“接口”或“代表”。

接口在各种语言(包括C#和Java)中更为常见,并允许您提供所有共享相同接口的不同实现(通过实现类),并且可以互换使用。

代表也是一个相当酷的选择,但仅限于一种方法 - 这实际上可能就是你在这里寻找的方法。 (与界面相比,界面定义了作为界面一部分存在的一个或多个方法)。

其他一些参考资料:

答案 1 :(得分:3)

就个人而言,我认为你需要以不同的方式解决问题。这是面向对象编程是你的朋友的地方。基本上,您将抽象出特定于数据库的内容,因此调用代码不知道它正在使用哪个数据库。如果你是从头开始,这是一个非常简化的例子:

public interface IDatabase {
   void Connect(string ...);
   string Query(string ...);
}

public class MySQLDB : IDatabase {
   void Connect(string ...){
       MySqlConnection connection = new MySqlConnection(connectionString);
       ...
   }

    // same for query, etc
}

public class OracleDB : IDatabase {
   void Connect(string ...){
       // connect using Oracle library
       ...
   }

    // same for query, etc
}

那么,在您的客户端代码中,您选择要实例化的数据库类型,然后调用相同的函数,无论它是什么类型:

IDatabase db;
if (dbtype == "mysql")
   db = new MySqlDB();
else if (dbtype == "oracle")
   db = new OracleDB();

db.Connect(...);
...

答案 2 :(得分:1)

public static IDbConnection connect(String connectionString)
{
    if ( dbtype == "mysql" )
    {
        MySqlConnection connection = new MySqlConnection(connectionString);
        connection.Open();
        return connection;
    }
    else if ( dbtype == "mssql" )
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}

答案 3 :(得分:0)

也许您可以选择工厂方法或策略来执行此操作。基本上你可以为工作创建一个界面:

public interface ConnectionFactory {
    IDBConnection CreateConnection(string connectionString);
}

然后根据type给他们不同的实现。