2011-12-12 110 views
1

我意识到标题可能非常混乱,所以要解释我想要做什么,我将说明如何在PHP中轻松解决相同的问题。切换不同的方法,但使用相同的名称 - C#

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

现在我使用Visual Studio 2010。既然不能做到这一点有同样的问题,但在C#:

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

上述的大问题特别是我不能把一个if-clause围绕一个方法(函数),那么我必须面对每种数据库类型独有的类型问题,因为我必须在每个与数据库函数相关的方法中包含返回的连接变量。

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

回答

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(...); 
... 
5

你会想研究“接口”或“代表”。

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

代表也是一个相当酷的选项,但仅限于一种方法 - 这实际上可能是您在这里寻找的。 (与定义一个或多个作为接口一部分的方法的接口相比)。

一些额外的引用:

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

也许你可以选择Factory Met hod或战略来做到这一点。基本上,你可以创建一个接口的工作:

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

然后给他们基础上,type不同的实现。

相关问题