Доступ к базе данных из любого места в приложении - PullRequest
2 голосов
/ 18 мая 2009

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

Я знаю, что в C # и других более современных языках OO глобальные переменные не одобряются. Итак, как я могу получить доступ к своей базе данных, откуда мне это нужно? Самая большая проблема, которую я имею, - это конфигурация: местоположение, пользователь, пароль и т. Д. Неизвестны во время разработки.

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

Какое стандартное решение?

Спасибо, привет, Миэль.

Ответы [ 6 ]

3 голосов
/ 18 мая 2009

Определить абсолютную лучшую практику для доступа к базе данных в ООП немного сложно.

Вы ударили ноготь по голове, что нужно учитывать множество факторов:

  • как обрабатываются параметры конфигурации?
  • приложение многопоточное? вам нужны пулы соединений с базой данных?
  • нужна ли вам переносимость базы данных (т. Е. Используете ли вы разные БД при разработке и в производственном процессе? Вас беспокоит блокировка поставщика одной БД? Вы распространяете приложение для других пользователей, которые могут использовать другую БД?)
  • Вас интересует защита ваших операторов SQL или централизованное применение других разрешений на доступ?
  • Существует ли общая логика при выполнении некоторых вставок и обновлений, которые вы не хотели бы дублировать при каждом касании конкретной таблицы?

Из-за этого многие ООП тяготеют к структуре ORM для чего угодно, кроме самых простых случаев. Общая идея заключается в том, что логике вашего приложения не нужно напрямую взаимодействовать с базой данных: изолируйте ваш бизнес-код от фактического механизма персистентности как можно дольше.

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

Например, допустим, в вашей системе есть понятие «человек». Вы, вероятно, смоделировали бы это как класс с некоторыми свойствами. В псевдокоде:

Person:
    - first_name
    - last_name

Тогда ваш реальный код в системе связан только с созданием экземпляров и использованием объектов Person, а не с получением дескрипторов БД или написанием SQL:

p = Person.get(first_name='Joe')
p.last_name = 'Bloggs'
p.save()

В объектно-ориентированном мире вы обнаружите, что ваш код бизнес-логики становится чище (и короче!), Проще в обслуживании и намного более тестируемым.

Конечно, вы правы в том, что это означает, что теперь вам нужно уйти и создать серверную часть базы данных, которая преобразует этот класс Person в одну или несколько таблиц в вашей реляционной базе данных. Вот где использование ORM фреймворка оказывается полезным. В Python люди используют Django и SQLAlchemy. Я позволю другим указать, что люди используют в C # (я не разработчик для C #, но вы отметили свой вопрос OOP, поэтому я собираюсь дать общий ответ, а не конкретный для C #).

Суть в том, что платформа ORM помещает весь доступ к БД в единый набор классов в коде, так что доступ к БД, конфигурация и пулы обрабатываются в одном месте ... нет необходимости создавать их экземпляры во всем приложении. То, что вы используете «там, где вам это нужно» - это объект модели.

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

Надеюсь, это поможет.

3 голосов
/ 18 мая 2009

Я всегда использую шаблон синглтона . Что касается конфигурации, посмотрите на класс System.Configuration.ConfigurationManager , который позволяет вам читать настройки из файла app.config / web.config вашего проекта.

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

Мне кажется, что вам нужно создать соответствующий объект (содержащий соединение или подобное) и передать этот экземпляр каждому объекту, требующему доступа (см. внедрение зависимостей )

Это отличается от использования синглетонов. Используя этот механизм, он освободит вас от зависимости от одного объекта и (возможно, более веская причина в этом случае) позволит вам выполнить тестирование, внедрив фиктивные объекты или аналогичные вместо изначально внедренного объекта средства доступа к базе данных. В этом сценарии я бы определенно избегал одноэлементного механизма.

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

Я на самом деле использую класс репозитория, который получает информацию db в своем конструкторе, и классы, в которых она нужна, передаются. Я фактически использую инструмент Inversion of Control (IOC) для ввода этих значений.

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

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

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

Вы можете где-то хранить информацию о пользователе в плоском файле, а затем читать / записывать в нее из своего db-класса

Таким образом, вы не будете дублировать настройки в своем коде, но пользователь все равно сможет их изменить.

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