【问题标题】:Switch on different methods but using the same name - C#打开不同的方法但使用相同的名称 - C#
【发布时间】:2012-01-18 03:53:12
【问题描述】:

我意识到标题可能很混乱,所以为了解释我想做的事情,我将说明如何在 PHP 中轻松解决同样的问题。

例如我让我的应用程序的用户选择数据库类型(即 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();
}

?>

但是

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
}
?>

现在我有同样的问题,但在 C# 中使用 Visual Studio 2010。因为我不能这样做:

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

上面的最大问题是我不能在方法(函数)周围放置一个 if 子句,那么我必须面对每个数据库类型所特有的类型的问题,事实上我必须在与数据库函数相关的每个方法中包含返回的连接变量。

那么,关于如何解决这个问题并让它像上面的 PHP 示例一样工作有什么想法吗?我既不是 C# 专家也不是新手,但我学得很快。

【问题讨论】:

    标签: c# php mysql sql-server methods


    【解决方案1】:

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

    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】:

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

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

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

      【讨论】:

        【解决方案3】:
        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;
            }
        }
        

        【讨论】:

          【解决方案4】:

          你会想要研究“接口”或“委托”。

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

          委托也是一个很酷的选择,但仅限于一种方法 - 这实际上可能是您在此处寻找的方法。 (与定义作为接口一部分存在的一个或多个方法的接口相比)。

          一些额外的参考资料:

          【讨论】:

            猜你喜欢
            • 2013-02-28
            • 2016-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-21
            相关资源
            最近更新 更多