C#策略模式和数据库访问

时间:2009-09-22 09:56:00

标签: c# strategy-pattern

我是设计模式的新手,现在我想实施策略模式。这是我的代码:

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中的数据库。但此时我正在重复自己吧?因此,如果连接字符串发生更改,我必须在每个类中修改它。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

您可以为数据库操作提供另一层抽象。该层应负责获取集中访问的所有数据库请求。连接字符串应在外部配置,数据映射层可以直接访问它们。

Repository Pattern是您可以应用的此图层的好模式。它可以位于域对象和数据映射层之间。

答案 1 :(得分: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重用于任何其他类。

答案 2 :(得分:0)

既然你不喜欢Lennaert回答将连接传递给你的类,为什么不反转它并创建一个使用简单命令模式的连接类并将你的类作为参数传递给它?