Фреймворк DAL, используемый многими программами на нескольких компьютерах

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

Мы думаем начать разработку на C # и исследуем, как лучше всего создать структуру базы данных, которую могут использовать все приложения. Мы не можем использовать какие-либо существующие фреймворки, если старая база данных реального времени не поддерживает SQL.

Я думаю о создании DAL с T4 из определения базы данных. Однако я вижу проблему в том, что происходит, когда база данных изменяется и DAL необходимо перекомпилировать. Достаточно ли скопировать dll-файл, содержащий DAL, на все компьютеры, или нам придется перекомпилировать приложения?

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

Я боюсь, что это может стать проблемой обслуживания, и ищу лучшее решение.

Изменить

Первичные ключи не постоянны в базе данных, но регенерируются один раз в год. Чтобы программы могли найти правильную строку в базе данных, используются константы поиска. В существующих программах константы используются непосредственно в коде в форме <TableName(RowName)>. Затем константы заменяются препроцессором на текущее значение первичного ключа. Это означает, что все приложения должны быть перекомпилированы при перестроении базы данных.

Поэтому невозможно использовать, например, GetByKey(int key) в BLL, поскольку ключ не является постоянным. Я вижу ряд различных решений, перечисленных ниже, какие хорошие, а какие плохие? Скажите, пожалуйста, видите ли вы какие-либо другие решения лучше:

  • Определите константу поиска в DAL:

    BLL.TableName.GetByKey (DAL.TableNameLookup.RowName)

    • Pros: The constant i defined in DAL and I don't have to replace BLL if the lookups is changed.
    • Минусы: подробный синтаксис.
  • Определите поиск в BLL:

    BLL.TableName.RowName

    • Pros: Simple syntax
    • Минусы: мне нужно обновлять BLL при изменении констант поиска.

Это можно решить как с помощью генерации кода (T4), так и с помощью DynamicObject. Используется Om DynamicObject, константы могут быть определены в XML-файле, который можно легко обновить. Однако это будет значительно медленнее.

Я не думаю, что любой из этих способов хорош. Пожалуйста, помогите мне придумать что-нибудь получше.


person magol    schedule 27.01.2014    source источник


Ответы (1)


Используйте еще один уровень между DAL и приложением (например, BL-Business Layer)

Вызовите методы уровня DAL в BL и From Application вызовите BL Layer. Таким образом можно избежать зависимости между DAL и Application. Затем, когда вы когда-либо вносите изменения в базу данных, меняйте только слой DAL и заменяйте dll. Нет необходимости компилировать приложение при каждом изменении DAL.

person Vasanth    schedule 27.01.2014
comment
Но если я все правильно понимаю, BL возвращает объекты, отображающие столбцы в базе данных. И если столбцы изменятся, объект, возвращаемый из BL, также изменится. Или я что-то неправильно понял? - person magol; 27.01.2014
comment
вы должны сопоставить столбцы с DAL. В DAL вы конвертируете отображаемые данные в объекты. Верните этот объект BL. BL не отображается напрямую на столбцы. Если вы меняете базу данных, вам следует изменить только DAL. Потому что BL по-прежнему ожидает объект от DAL (из DAL вы должны отправить объект того же типа в BL). Тогда изменения БД не повлияют на Приложение. После изменения в DB измените DAL, чтобы вернуть правильный объект, необходимый для BL. - person Vasanth; 27.01.2014
comment
ааа, я немного не понял. Вы правы, что я, наверное, могу использовать BLL между программами и DAL. Но одна проблема, с которой я все еще сталкиваюсь, заключается в том, что база данных в значительной степени основана на константах поиска. Я напишу о них немного подробнее в дополнении к этому вопросу. У вас есть предложения, как я могу это решить? - person magol; 27.01.2014
comment
Я думаю, что для поиска вам не о чем беспокоиться. Потому что, если вы обновляете данные таблицы поиска в базе данных, вам также не нужно обновлять даже DAL. Он автоматически извлекает данные поиска, имеющиеся в БД. Только если вы измените структуру (дизайн) таблицы, вы должны внести изменения в DAL. - person Vasanth; 27.01.2014
comment
Если я правильно вас понял, программа должна сначала получить текущий первичный ключ из таблицы поиска, а затем получить нужную строку. Это создает два доступа к базе данных. В обычной реляционной базе данных это было решено с отношением, но что-то подобное не существует в этой старой базе данных. Вторая проблема, которую я вижу, заключается в том, что нет IntelliSense или управления компиляцией, если я использую, например, строки в качестве констант. - person magol; 27.01.2014