2012-07-27 150 views
1

FOLLOW UP TO MARC GRAVELLS SUGGESTION IN THIS QUESTION創建一個工廠方法來創建新的SqlConnection對象

我現在有這樣的事情反覆在我的代碼數次:

using (var conn = CreateConnection()) 
using (var dataCommand = conn.CreateCommand()) 
{ 
     conn.Open(); 
     [...]       
} 

是下列正確的工廠方法CreateConnection()?還是會出現錯誤? (注:我只是曾經打算從using指令稱呼它)

SqlConnection CreateConnection() 
{ 
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString); 
    return conn; 
} 

還是會有修改這一方法有它的Open還有一個情況?

+0

你好whytheq你想避免在您的服務冗餘碼? – 2012-07-27 12:43:45

+0

我想避免重複這一行'SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings [「IMS」] .ConnectionString);'在我的代碼 – whytheq 2012-07-27 12:47:08

+0

很多地方我在我的博客 – 2012-07-27 12:52:42

回答

4

您的代碼是靜態工廠方法的典型示例。

工廠模式是Software Design Patterns的一部分,它是軟件設計中給定上下文中常見問題的一般可重用解決方案。我可以建議你閱讀Head First Design Patterns這是一本非常好的入門書籍,以瞭解設計模式。

夫婦的有關您的代碼的建議:

  1. 使工廠方法靜態的,它不使用任何實例變量等
  2. 沒有關係,但你並不需要使用局部變量在你的工廠方法中,你可以直接返回連接。

現在你的方法是這樣的:

static SqlConnection CreateConnection(){ 
    return new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString); 
} 

你可能要檢查的ConnectionStrings [ 「IMS」]是調用的SqlConnection的構造函數之前空。此類不需要進一步的錯誤處理,因爲它不會啓動連接。

比方說,你想在同一個方法返回一個打開的連接和處理連接錯誤:

static SqlConnection CreateConnection() 
{ 

    if (ConfigurationManager.ConnectionStrings["IMS"] == null) 
    { 
     throw new Exception("Connection string not found in the configuration file."); 
    } 
    var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString); 
    try 
    { 
     sqlConnection.Open(); 
    } 
    catch (Exception exception) 
    { 
     throw new Exception("An error occured while connecting to the database. See innerException for details.", exception); 
    } 
    return sqlConnection; 
} 

如果你願意,你可以創建自己的異常類稍後處理這些異常。見ASP MVC N-Tier Exception handling。如果發生異常,您也可以返回null,但首先請檢查「Is returning null bad design?」。

+0

+1基於模板方法提交我的解決方案+1爲了幫助到目前爲止:可以檢查ConnectionStrings [「IMS」]爲null是否在此statuc方法內完成?與這些服務器聯繫的其他方法可以包含在這些靜態工廠方法中? – whytheq 2012-08-06 13:32:00

+0

例如,您可以返回一個打開的連接,在這種情況下,您可以檢查連接是否已建立(並處理連接錯誤) – 2012-08-06 14:36:50

+0

您可以添加一個示例到您的答案中,我將使用的語法達到這個目標? – whytheq 2012-08-06 17:03:42

2

廠和辛格爾頓:

我咆哮。更正歡迎!

從功能上看,我發現開發人員理解工廠模式的方式已經脫節。在簡單的 意義上,工廠將會並且應該給出一個產品。 (例如:如果你有一個「汽車廠」,它應該給一輛「汽車」)。

話雖如此,只有當您不希望實例化邏輯被暴露時才實現工廠模式 並且需要創建不同的具體產品。在你的情況下,如果你的需要是 總是一個SQL對象(一種產品)然後爲什麼Factory? 你可以爭論可擴展性和可擴展性,但這是主觀的。大多數公司只與 SQL服務器或Oracle共存很長時間,您不會使用您在產品中構建的可伸縮性。

  1. 我相信,你可以很好地與Singleton pattern(或)靜態成員更簡單的類生活。
  2. 另一個重要的方法是CloseConnection()方法。 在您的原始代碼中,您已經使用了using,它會殺死並處理對象,但在您的新的 靜態實現中,您可能想要構建它。

    public static void CloseConnection() { if (conn.State == ConnectionState.Open) { conn.Close(); conn.Dispose(); } }

相關問題