Шаблон стратегии C # и доступ к базе данных - PullRequest
1 голос
/ 22 сентября 2009

Я новичок в разработке шаблонов, и теперь я хочу реализовать Паттерн стратегии. Вот мой код:

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();
        }

    }
}

В методе Send в классе SendAppointment элемент будет отправлен. У меня вопрос, нужно ли подключаться к базе данных в этом классе? Если это так, то я также должен подключиться к базе данных в SendTask. Но в этот момент я повторяюсь, верно? Поэтому, если строка подключения изменяется, я должен изменить это в каждом классе. Как я могу решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 22 сентября 2009

У вас может быть другой уровень абстракции для операций с базой данных. Этот уровень должен отвечать за принятие всех запросов к базе данных, централизующих доступ. Строки соединений должны быть настроены извне, и уровень отображения данных может иметь к ним прямой доступ.

Шаблон репозитория - это хороший шаблон для этого слоя, который вы можете применить. Он может находиться между объектами вашего домена и слоями отображения данных.

1 голос
/ 22 сентября 2009

Как насчет инициализации каждого разработчика 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 голосов
/ 09 сентября 2010

Поскольку вам не нравится ответ Леннарта о передаче соединения вашему классу, почему бы не изменить его и создать класс соединения, который использует простой шаблон команды и передать ему свой класс в качестве параметра?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...