На проекте, который я сейчас веду с командой из четырех человек, мы решили отказаться от использования полноценной ORM в пользу Dapper. Чем это обусловлено, какие дает плюсы и минусы, я расскажу в этой заметке.
Dapper - это так называемая micro-ORM. По сути, это просто набор extension-методов для интерфейса IDbConnection, которые позволяют просто выполнить SQL-запрос, либо выполнить SQL-запрос и "замапить" результаты на DTO. Эту библиотеку используют, например, на StackOverflow.
В чем профит от использования Dapper?
- Быстрый старт: не нужно никаких конфигов, маппингов, программист сам управляет подключением.
- Самописные SQL-запросы: как правило, запросы, генерируемые ORM, получаются неоптимальными, а в случаем с Dapper запросы будут такие, какие нужно.
- Быстрый маппинг: ссылки для сравнения скорости приложу ниже.
Основной очевидный минус, который в то же время и плюс, - это написание SQL-кода вручную. На дистанции это создает проблемы при рефакторинге, а так же дублирование логики SQL-запросов. Отчасти с этим помогает справляться шаблон Query Object, о котором чуть ниже.
Когда использовать Dapper?
Мне видятся два варианта использования этой micro-ORM, зависящие от типа проекта.
- Простой небольшой проект. Быстрый старт и простая работа с библиотекой, позволят очень быстро показать работающий результат. Накидать DTO, QueryObject'ов и уже работать с БД. На текущем проекте это позволило нам достаточно быстро создать Back-end часть довольно крупного CRUD'a.
- Highload проект или когда много взаимодействия с БД. Самописные SQL-запросы + высокая скорость маппинга дают ощутимый результат.
Шаблон Query Object
Разрабатываемое приложение нужно расширять и поддерживать, а написание SQL-кода в проекте, может привести к сложностям при рефакторинге и дублированию. Например, когда мы изменяем название колонки в таблице БД, то соответственно нужно изменить название поля и в DTO и в запросе.
Отчасти с этой проблемой нам помогает справиться паттерн Query Object. По сути, это объект, который представляет собой запрос к БД, то есть инкапсулирует в себе логику запроса.
Пример кода без использования шаблона Query Object.
using (var connection = _factory.CreateConnection()) { var accounts = connection.Query <AccountDto> ("select Id, Name from Accounts").ToList(); }
Используя такой подход к работе с запросами, мы наплодим в коде кучу дублирования. Решим эту проблему добавлением Query Object.
using (var connection = _factory.CreateConnection()) { var selectAccount = new SelectAccount(); var accounts = connection.Query<AccountDto>(selectAccount.All()).ToList(); }
То есть мы инкапсулировали сам SQL-запрос в некий класс, который создает QueryObject через вызов All, что означает выборку всех элементов.
Реализация Query Object может быть, например, такой:
public class QueryObject { public QueryObject(string sql, object queryParams = null) { Sql = sql; QueryParams = queryParams; } public string Sql { get; private set; } public object QueryParams {get; private set;} }
Метод-расширения IDbConnection, для работы с QueryObject:
public static IEnumerable<T> Query<T>(this IDbConnection connection, QueryObject queryObject) { return connection.Query<T>(queryObject.Sql, queryObject.QueryParams); }
Тогда реализация класса SelectAccount может быть такой:
public class SelectAccount { public QueryObject All() { return new QueryObject("select Id, Name from Accounts"); } public QueryObject ById(int id) { return new QueryObject(All().Sql + " where Id=@Id", new {Id = id}); } }
Теперь видно, что код запросов может быть переиспользуем в разных запросах.
What to do in casinos - TricktoAction
ОтветитьУдалить› casino-faq › what-to-do- › casino-faq 파워 사다리 › what-to-do- There are over 500 casinos worldwide! and if you 바카라 사이트 need 외국 라이브 to do a casino review and 프로토 승부 식 배당률 보기 ask for a $20 free chip no deposit bonus, then you'll get up to $1,000 in 추천 사이트 chips.
Play online game - GTS Games
ОтветитьУдалитьThe player controls Algoia in this game. The plot 예스카지노 turns in the course of the game. The player looks back at the main plot for a 우리카지노 full