2011-12-12 111 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不同的實現。

相關問題