2009-09-22 43 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将连接传递给您的类的答案,为什么不反转它并创建一个使用简单命令模式并将您的类作为参数传递给它的连接类?