пятница, 5 февраля 2010 г.

SubSonic ORM и немного магии.

Мне довольно много приходилось писать приложения, которые тем или иным образом взаимодействуют с базами данных. Доводилось применять компоненты ADO.NET, потом я испробовал LINQ2SQL и LINQ2Entities, но все они в некотором роде смущали телодвижения. Неудобства возникали самые разные, начиная от привязки к конкретное базе данных, до отсутствия нужной гибкости,  из за которой нужно было придумывать различные извращения (Например как здесь). Поэтому для работы над новым проектом я решил найти что то более гибкое, простое в использовании, назависимое от конкретной базы данных и т.п.

На SubSonic я обратил внимание случайным образом, но был действительно удивлен, на сколько он может упростить жизнь разработчику. SubSonic представляет собой "A Super High-fidelity Batman Utility Belt that works up your Data Access (using Linq in 3.0), throws in some much-needed utility functions, and generally speeds along your dev cycle." или же попросту говоря мощный и в тоже время простой в применении ORM Framework. Поддерживается SQLServer, MySQL, SQLlite и в разработке Oracle (исчезает проблема переносимости). SubSonic содержит много вкусностей, о которых я попытаюсь рассказать.

Итак, SubSonic реализовывает 2 сценария работы, SimpleRepository и ActiveRecord.

  • ActiveRecord - похоже на то, что происходило в LINQ2SQL и LINQ2Entities. Существует база данных и мы с помощью специального шаблона генерируем нужные нам классы C#. Далее их используем.
  • SimpleRepository - более простой и в тоже время элегантный сценарий. Вы определяете строку подключения к пустой базе данных, определяете класс с свойствами, которые нужно хранить в базе и ... все!. Все готово для работы.
В данном посте хочу рассказать про второй подход, поскольку именно он меня поразил меня элегантностью, хоть и имеются некоторые минусы.
Приведу сразу пример:
Все что нужно для работы с базой. SubSonic самостоятельно генерирует таблицу и добавляет в нее запись.

Но магия на этом не заканчивается. Допустим в процессе разработки нужно добавить новые поля в нашу структуру... И все что нам нужно сделать ...  - это просто добавить свойство в наш класс.


При этом SubSonic автоматически добавит нужные поля в таблицу и добавит запись (при этом старые записи остаются в полной сохранности). Данная возможность обеспечивается благодаря использованию С# Reflection. На данный момент я заметил только один недостаток при работе с этим сценарием - это невозможность определить зависимости между таблицами. В этом случае приходится использовать ActiveRecord (о нем я рассказу позднее).

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

Несколько полезных ссылок:
http://www.codeproject.com/KB/database/SubSonic.aspx

3 комментария:

  1. ага, я тобі про подібні штуки на Ruby on Rails вже розказував )

    ОтветитьУдалить
  2. Неудобства возникали самые разные, начиная от привязки к конкретное базе данных???
    это говорит только о некомпетентности
    мы при разработке используем именно Entity Framework и базы меняем как перчатки прям на ходу (не базы конкретно MSSQL а смена базы MSSQL на MySql)

    ОтветитьУдалить
  3. Ну так об этом и речь. Привязка только к MSSQL является неудобным.

    ОтветитьУдалить