В нашем проекте у нас есть много небольших программ, распределенных на нескольких компьютерах, каждая из которых отвечает за определенные задачи в отношении устаревшей базы данных. Сегодня они написаны на 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-файле, который можно легко обновить. Однако это будет значительно медленнее.
Я не думаю, что любой из этих способов хорош. Пожалуйста, помогите мне придумать что-нибудь получше.