2009-09-22 44 views
1

我是新來的設計模式,現在我想實施戰略模式。這裏是我的代碼:C#戰略模式和數據庫訪問

namespace StrategyPattern 
{ 
    public interface ISendBehavior 
    { 
     void Send(); 
    } 

    public class SendAppointment : ISendBehavior 
    { 
     public void Send() 
     { 
      // send item 
     } 
    } 

    public class SendTask : ISendBehavior 
    { 
     public void Send() 
     { 
      // send item 
     } 
    } 

    public class SendItem 
    { 
     ISendBehavior _sendBehavior; 

     public SendItem(ISendBehavior sendbehavior) 
     { 
      _sendBehavior = sendbehavior; 
     } 

     public void Send() 
     { 
      _sendBehavior.Send(); 
     } 
    } 

    /* CALL */ 

    public class Aanroep 
    { 
     public void Verzenden() 
     { 
      SendItem app = new SendItem(new SendAppointment()); 
      app.Send(); 
     } 

    } 
} 

在SendAppointment類的Send方法中,將發送該項目。我的問題是,我必須連接到這個類的數據庫嗎?如果是這樣,那麼我還必須連接到SendTask中的數據庫。但在這一點上,我重複自己的權利?所以如果連接字符串發生變化,我必須在每個類中修改它。我怎麼解決這個問題?

回答

1

如何使用另一個負責數據庫連接的對象初始化ISendBehavior的每個實現者?

你Verzenden() - 執行會像

IDatabaseConnection connection = new DatabaseConnection(); 

SendItem app = new SendItem(new SendAppointment(connection)); 

和你ISendBehavior.Send()將這樣

_databaseConnection.Send(...); // fill behavior-specific information here (perhaps with properties) 

通過這種方式來實現,你可以重複使用IDatabaseConnection類型的任何其他類。

+0

Thnx用於響應。我不是真的最後一部分。因此,接口中的發送方法現在看起來像這樣發送(IDatabaseConnection db)?而_databaseConnection是ISendBehavior中的一個成員變量,並且在方法中發送了_databaseConnection = db?但是,我如何調用發送方法?我需要在哪裏設置查詢? – Martijn 2009-09-22 10:12:20

+0

您應該注意到,在示例代碼中,我將DatabaseConnection傳遞給了SendAppointment構造函數(它將設置_databaseConnection成員)。 在那個DatabaseConnection中,你存儲任何與數據庫相關的東西。最快的方法是僅存儲連接字符串等,並仍然執行SendAppointment類的查詢 - 這樣,您只需指定連接字符串一次。 (最簡潔的方法是將所有數據庫代碼放在額外的類中,並讓SendAppointment使用該類的實例來執行數據庫操作。) – Lennaert 2009-09-22 10:27:45

+0

因此,對於最簡潔的方法,我必須創建另一個數據庫類並讓SendAppointment使它的一個實例。這樣,我不必將連接作爲參數發送給SendAppointment()吧?因爲我在這個方法中創建了一個實例。這樣SendAppointment的Send方法創建所有查詢。它是否正確? – Martijn 2009-09-22 10:38:46

2

您可以爲數據庫操作設置另一個抽象層。該層負責集中訪問所有數據庫請求。連接字符串應該在外部進行配置,數據映射層可以直接訪問它們。

Repository Pattern是適用於此圖層的很好模式。它可以位於你的域對象和數據映射層之間。

+0

可以給一個僞代碼的例子嗎? – Martijn 2009-09-22 10:22:23

+0

這篇文章http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx應該可以幫到你。如果您使用Linq2SQL:http://geekswithblogs.net/AndrewSiemer/archive/2008/02/05/linq-to-sql---implementing-the-repository-pattern.aspx – 2009-09-22 10:28:52

+0

我已經讀了一些關於存儲庫模式,但我不明白我能如何將這種情況應用於我的情況。你能幫助我嗎? – Martijn 2009-09-22 11:09:03

0

由於您不喜歡Lennaert將連接傳遞給您的類的答案,爲什麼不反轉它並創建一個使用簡單命令模式並將您的類作爲參數傳遞給它的連接類?