C # OO Дизайн Вопрос - PullRequest
3 голосов
/ 11 мая 2009

У меня есть приложение Windows Form, написанное на C #. класс main_form создает экземпляр AccessProcess с именем AccessProcessWorker, который является классом, наследуемым от BackgroundWorker, затем main_form затем инициализирует Process с помощью следующего кода

        AccessProcessWorker.DoWork += new DoWorkEventHandler(processWorker.worker_DoWork);
        AccessProcessWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(processWorkerCompleted);
        AccessProcessWorker.ProgressChanged += new ProgressChangedEventHandler(processProgressChanged);

это приложение только что перешло из POC, чтобы "заставить его работать быстро".

Я написал это приложение для работы с базой данных Access, но теперь хочу, чтобы оно работало против MS Sql, но оставляю возможность работать и против доступа. Итак, я мог бы сделать что-то уродливое, например, создать экземпляр и инициализировать SqlProcessWorker или AccessProcessWorker, основываясь на некотором выборе пользовательского интерфейса, сделанном пользователем. Но я хотел бы сделать так, чтобы main_form всегда создавал что-то вроде IP-процесса, поэтому мне не приходилось добавлять логику в main_form каждый раз, когда появляется новый ProcessWorker. Проблема в моем дизайне заключается в том, что инициализация прерывается, когда я делаю это так, как я описал.

Если у кого-то есть какие-либо идеи или нужна дополнительная обработка, пожалуйста, дайте мне знать.

Ответы [ 6 ]

4 голосов
/ 11 мая 2009

То, что вы ищете, называется «внедрение зависимости».

2 голосов
/ 11 мая 2009

В интересах простоты, я бы на самом деле просто выбрал "уродливый" подход.

Вы упомянули Access и SQL Server в качестве двух текущих баз данных, но сколько вы реально считаете, что ваше приложение нуждается в поддержке? По моему опыту, платформа базы данных приложения очень редко изменяется и не без серьезного обдумывания.

Если существует большой набор поддерживаемых платформ баз данных, и вы не можете предсказать, какие из них заранее, то, возможно, будет полезен не связанный дизайн. Иначе ПОЦЕЛУЙ.

2 голосов
/ 11 мая 2009

В какой-то момент вам потребуется создать экземпляр правильного типа, но Заводской шаблон обычно здесь. Теперь, это может быть немного, если у вас будет только один из двух типов «new» для получения вашего объекта IProcess.

1 голос
/ 11 мая 2009

Я бы обернул "некрасивые" биты кода в отдельный метод, или, предпочтительно, в класс, который заботится о выборе БД для взаимодействия и синхронизации с фактическими экземплярами BackgroundWorker. Здесь важно придерживаться принципа СУХОЙ: не повторяйте себя.

1 голос
/ 11 мая 2009

Если обе базы данных имеют одинаковую структуру и структуру, вы можете просто использовать EntitySpaces и изменить подключение по умолчанию для приложения. То есть у вас есть одна база кода, когда речь идет о доступе к данным, а затем вы просто устанавливаете текущее соединение в зависимости от того, хотите ли вы получить доступ или базу данных SQL.

0 голосов
/ 11 мая 2009

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

Вы уверены, что где-то не существует класса, который уже работает как с Sql Server, так и с MS Access? Например, OleDbConnection, OleDbCommand? Для простого SQL все, что вам нужно, это изменить строку подключения, и вы сможете работать с обеими базами данных.

Если вы еще не закодировали остальную часть приложения, вам потребуется день или два, чтобы найти некоторые фреймворки, сравнить и выбрать один из ваших вариантов. Это заставит вас писать меньше кода, и в будущих приложениях вы будете избавлены от большей части кода. Я гарантирую, что вложенное время будет вам возвращено многократно (если вы работаете с базами данных время от времени, то есть).

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