Предлагаемая архитектура для связывания кода со строками БД - PullRequest
0 голосов
/ 26 июня 2009

У меня есть ситуация, когда у меня есть куча строк в базе данных. Например, допустим, у нас есть таблица с именем ReportRendererType.

Строки могут быть:

  • Линейный график
  • Гистограмма
  • Сетка

и т.д.

Я могу использовать базу данных для хранения того, как определенные пользователи хотят просматривать определенные отчеты. Например. Фрэнку нравится отчет о прибыли, отображаемый в виде гистограммы. Было бы замечательно, если бы я мог связать код с записью в БД. Другими словами, было бы здорово, если бы класс LineGraphRenderer знал, что он связан со строкой 1 в таблице ReportRenderType. Один из тривиальных примеров того, почему это было бы полезно, состоит в том, что вы можете заполнить раскрывающийся список параметров ReportRenderType, а затем выбрать значение, и класс Manager может легко выяснить, как отобразить отчет, учитывая значение, выбранное из раскрывающегося списка. Тогда возникает вопрос - как сделать связь между БД и этим фрагментом кода?

Есть много вариантов:

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

B. Вы можете сделать так, чтобы LineGraphRenderer возвращал перечисление, которое имело значение первичного ключа (C # позволяет вам сделать это, явно устанавливая значение хеш-кода), это дает статическую типизацию и единое местоположение для всех записей БД.

C. У LineGraphRenderer может быть свойство ReportRendererType, которое возвращает первичный ключ, но извлекает значение для связанной строки из файла настроек. Это облегчит создание ассоциаций, особенно если кто-то другой имеет разные значения первичного ключа. Например, компания A может хранить LineGraph в строке 1, а компания B может хранить LineGraph в строке 2.

К сожалению, все эти способы также имеют недостатки. Мне интересно, как эта проблема решалась другими, и нашли ли они какие-то отличные способы сделать то, чего мне не хватает.

Ответы [ 3 ]

1 голос
/ 26 июня 2009

Я предлагаю, чтобы вы не связывали код со строками базы данных! Это совершенно противоречит разделению интересов.

Если честно, это не самая глупая идея, которую я когда-либо слышал; но это довольно близко.

1 голос
/ 26 июня 2009

Я широко использую опцию B. Это зависит от двух вещей:

  1. Значения не подлежат частому изменению (для этого требуется редактировать и перестраивать код)
  2. База данных должным образом нормализована, поэтому вы перечисляете первичный ключ, например, ReportRendererType, который используется в базе данных в качестве внешнего ключа (например, в вашей таблице Customer).

Это работает очень хорошо, поскольку вы можете ссылаться на перечисленные значения непосредственно в запросах и обновлениях базы данных. Если вы планируете заранее, вы также можете создать имена перечислимых типов, чтобы их можно было легко отобразить в пользовательском интерфейсе, разделив текст заглавными буквами. Например, «BarGraph» становится «Гистограммой».

Зависит от того, хотите ли вы, чтобы ваш код был тесно связан с вашей базой данных или нет. Лично мне это удобно, но другие могут и не быть.

0 голосов
/ 26 июня 2009

У меня была похожая проблема.

Вы можете определить интерфейс для класса Renderer. Затем вы реализуете базовый рендерер (возможно, Line Graphe) и все остальные классы рендерера. У вас есть RendererFactory, в котором есть GetRenderer. Затем вы даете этот Factory Parameter и Factory не можете посмотреть на БД, которую должен использовать Renderer. Если Фабрика ничего не нашла, используйте Default Renderer.

Может быть, что-то вроде этого - идея.

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