- PVSM.RU - https://www.pvsm.ru -
Доброго времени суток, %username%! Вот и я решился на написание статьи на данном ресурсе. Речь пойдет о доступе к данным из приложений написанных на .NET, в частности на языке C#. Все мои мысли, и во что они в итоге вылились, я попытаюсь изложить под катом. Добро пожаловать!
Под СУБД в статье будем понимать реляционную СУБД. Забегая вперед, скажу, что представленная библиотека (фреймворк) не является заменой Entity Framework, не зависит от него и не имеет к нему никакого отношения.
Тем не менее, оттолкнёмся от вышеупомянутого фреймворка. Одна из его идей – попытка (и весьма удачная) введения абстракции доступа к данным. Иными словами уход от конкретной СУБД.
Каждая СУБД имеет свои плюсы и свои минусы: некоторые имеет одни возможности, некоторые другие; некоторые делают хорошо одно, другие – другое и т.д. Давайте теперь представим, что взвесив все «за» и «против» мы выбрали некую СУБД для реализации какого-то грандиозного (или не очень) проекта и решили писать всё это с использованием… ADO.NET.
Плюсы ADO.NET:
Минусы ADO.NET (предпосылки к реализации проекта):
Ввероятнее всего читатель уже догадался, что мы будем думать как избавляться от вышеупомянутых недостатков. Поговорим о том, что является ключом к реализации всего проекта.
Начнем по порядку.
Как такая функция должна быть написана? Первое что приходит на ум – Reflection. Допустим. Но у Reflection есть один существенный недостаток – он медленный. Если при чтении/добавлении/изменении/удалении одного объекта быстродействие просядет несущественно, то при большом количестве объектов накладные расходы будут ощутимы.
На помощь нам придут Expression'ы и возможность их компиляции «на лету». Идея состоит в том, что тело функции генерируется, компилируется и ссылка на нее сохраняется в виде делегата. Делать это необходимо только один раз – при инициализации.
С чем должны работать функции? С тремя сущностями:
Для того, чтобы точка генерация данных функций была едина, введены следующие интерфейсы обёрток: IDbParameterCollectionWrapper и IReaderWrapper (см. ссылку на репозиторий проекта ниже). Для каждой СУБД необходимо реализовывать эти интерфейсы индивидуально. Забегая вперед: фреймфорк нацелен в первую очередь на скорость работы, поэтому в ряде случаев используется отложенная («ленивая») инициализация. Так же фреймфорк содержит несколько вспомогательных атрибутов для бóльшей гибкости (например, вычисляемые поля, обязательные поля и т.д.).
Проект уже можно опробовать (см. ссылки ниже). Имеется поддержка Linq! Проект в альфа-версии, поэтому код пока неидеален.
Что планируется добавить:
Ссылки:
» Проект WildData на GitHub. [1]
» Nuget-пакет WildData. [2]
» Nuget-пакет WildData (реализация для PostgreSQL). [3]
» Очень простой пример использования фреймворка. [4]
Строго прошу не судить. Это моя первая статья на хабрахабре. Спасибо за внимание!
P.S. По всем вопросам прошу в личку и комментарии.
Автор: fox_anthony
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/222610
Ссылки в тексте:
[1] Проект WildData на GitHub.: https://github.com/ModernRoute/WildData
[2] Nuget-пакет WildData.: https://www.nuget.org/packages/WildData/0.1.1-alpha
[3] Nuget-пакет WildData (реализация для PostgreSQL).: https://www.nuget.org/packages/WildData.Npgsql/0.1.1-alpha
[4] Очень простой пример использования фреймворка.: https://github.com/foxanthony/MeteringDevices/tree/master/Application/Data
[5] Источник: https://habrahabr.ru/post/314198/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.