Наклейка dapper что значит
Наклейки на авто со смыслом: виды, отношение к ПДД, популярные наклейки на автомобиль
Наклейки на автомобили чаще всего выполняются на виниловой пленке-самоклейке, продаются в магазинах и на сайтах для автолюбителей. Если водитель хочет наклеить редкое изображение или создать его самостоятельно, придется воспользоваться услугой изготовления эмблем на заказ.
Автолюбителей часто интересуют значения стикеров на машинах. Например, наклейка Dapper на авто означает, что владелец ставит качество транспортного средства на первое место. А ведь подобных значков много, и каждый несет в себе тайный смысл.
Что означают наклейки на кузовах и стеклах автомобилей
Автолюбители, которые хотят показать свою индивидуальность и выделиться из потока транспортных средств, используют наклейки на машину со смыслом. Они рассказывают о предпочтениях, увлечениях и философии водителя, а иногда представляют собой своеобразную рекламу.
Наклейка Dapper
В Европе и США наклейка Dapper на авто означает, что его владелец принадлежит к сообществу людей, которые предпочитают качественные, стильные и чистые машины. Что-то вроде российского КТА (Клуб Тюнингованных Автомобилей).
Наклейка Dapper на авто
До недавнего времени ее можно было получить от создателя под ником @em0rtal, в России ее изготавливают на заказ.
Мальтийский крест
Кресты в круге, которые называют мальтийскими — распространенные наклейки на авто со смыслом.
Мальтийский крест на машине
Существуют конспирологические теории о принадлежности автовладельца к тайному обществу, но чаще всего такие стикеры клеят уроженцы Грузии, чтобы распознать друг друга.
Наклейка паук на машине обычно означает, что водитель осторожен, предусмотрителен и аккуратен на дороге. Правда, иногда ей придают негативный смысл — на уличном жаргоне это членистоногое символизирует наркомана.
Наклейка «Паук» на машине
Ящерица
Быстрое, юркое животное может проникнуть куда угодно и мгновенно восстанавливается, а поймать его крайне сложно.
Наклейка «Ящерица» на машине
Эмблема «Ящерица» значит, что именно так владелец авто видит себя — ездит быстро и может преодолеть любое препятствие.
Питбуль
Голова этой собаки, как и наклейка Dapper на авто, означает принадлежность к определенной группе — эмблему используют две категории автовладельцев.
Наклейка «питбуль» на автомобиле
Первая — любители игр-гонок (питбуль является логотипом компании Pitbull Syndicate Ltd), вторая — ультраправые футбольные болельщики.
Злая свинья
Изображение злой свиньи когда-то было прерогативой компании Subaru. Его клеят поклонники бренда, которые помнят, что раньше под этой маркой выпускались машины для ралли.
Наклейка «злая свинья» на автомобиле
Правда, сегодня такие наклейки на авто могут значить, что у его хозяина просто не слишком добрый характер, и связываться с ним не стоит.
Спортсмены
Такие наклейки на авто означают, что водитель — фанат определенного вида спорта или занимается им. Это может быть клубная символика или силуэт человека — начиная с футболистов, заканчивая штангистами, лыжниками, серфингистами и т. д.
Наклейка футболиста на авто
Обычно подобные эмблемы можно купить, но для редких видов спорта придется изготавливать на заказ.
Красивые надписи
Наклейки на авто со смыслом чаще всего представлены надписями. Значение может быть разным, начиная со смешных (вроде «Еду как могу», «Блондинка за рулем»), заканчивая философскими изречениями. Распространенный пример: «Моя жизнь — мои правила».
Наклейки на авто со смыслом
Язык тоже бывает разным — некоторые автовладельцы делают надписи на русском, другие предпочитают английский, латынь, иероглифы.
Восклицательный знак
Такая наклейка на машине означает, что за рулем находится начинающий водитель.
Восклицательный знак на стекле автомобиля
Иногда она помогает в сложных ситуациях — если новичок не может завести машину на светофоре, большинство шоферов не будут сигналить, а мирно подождут. Правда, встречаются и те, которые захотят преподать «чайнику» наглядный урок с помощью грубой езды.
Буква «У»
Наклейки на автомобилях означают примерно то же, что и восклицательный знак — машину ведет ученик или начинающий водитель.
Наклейка на авто «Ученик за рулем»
Ответ на вопрос, стоит ли клеить ее на транспортное средство, остается открытым, ведь в некоторых случаях можно добавить себе проблем.
Болнисский крест, грузинский крест
Большинство водителей не видят разницы между мальтийским, болнисским и грузинским крестами, поэтому они имеют один и тот же смысл.
Болнисский крест на автомобиле
Реже такая наклейка на машине значит, что водитель считает себя «рыцарем дорог» или что транспортное средство освящено.
Чертик
Это не большая наклейка, а дополнительные аксессуары — рожки, хвост и лапа с трезубцем. Их клеят на эмблему автомобиля, после чего она превращается в изображение чертика.
Изображение чертика на логотипах разных автомобилей
О значении подобных наклеек на авто не смог рассказать ни один водитель — те, кто их использует, считают, что это «весело» и «прикольно».
Наклейки серии JDM
Отличный аксессуар для поклонников японской культуры. Наклейки-значки на авто из серии JDM (Japan Domestic Market), что значит «внутренний рынок Японии», включает целый ряд изображений, которые используются преимущественно в этой стране.
JDM наклейка на машину
Среди них есть стилизованный государственный флаг, веселые надписи, персонажи мультфильмов и многое другое.
Виды наклеек и отношение ПДД к ним
Отношение ГАИ и ПДД к наклейкам со смыслом на машинах нейтральное. Существуют надписи и значки, которые необходимо использовать по правилам — восклицательный знак или буква «У» (клеят в первые два года после получения прав), «За рулем инвалид», «Перевозка детей».
Поиск наклеек
Наклейки на автомобили чаще всего выполняются на виниловой пленке-самоклейке, продаются в магазинах и на сайтах для автолюбителей. Если водитель хочет наклеить редкое изображение или создать его самостоятельно, придется воспользоваться услугой изготовления эмблем на заказ.
Не стоит спешить с выбором — предварительно лучше узнать, что означают наклейки на автомобили с разными надписями или картинками. Некоторые из них могут спровоцировать ненужное внимание к транспортному средству, а иногда привести к серьезным неприятностям на дороге.
(dapper)
1 dapper
2 dapper
3 dapper
4 dapper
5 dapper
6 dapper
7 dapper
8 dapper
9 dapper
10 dapper
11 dapper
12 dapper
13 dapper
14 dapper
15 dapper
16 dapper
17 dapper
18 dapper
См. также в других словарях:
Dapper — may refer to: People Olfert Dapper (1635 1689), Dutch physician and writer Marco Dapper (born 1983), American actor and model Cliff Dapper (born 1920), former Major League Baseball catcher Places Musée Dapper, a Parisian museum specializing in… … Wikipedia
Dapper — Dap per, a. [OE. daper; prob. fr. D. dapper brave, valiant; akin to G. tapfer brave, OHG. taphar heavy, weighty, OSlav. dobr[u^] good, Russ. dobrui. Cf.
Dapper — steht für: Carl von Dapper (1863–1937), ein deutscher Internist und Kurarzt Olfert Dapper (* ca. 1635–1637; † 1689), niederländischer Mediziner und Schriftsteller Ubuntu 6.06, eine Linux Distribution mit dem Codenamen Dapper Drake (Adretter… … Deutsch Wikipedia
dapper — mid 15c., elegant, from M.Du. or M.L.G. dapper bold, strong, sturdy, later quick, nimble, from P.Gmc. *dapraz, perhaps with ironical shift of meaning (Cf. O.H.G. tapfar heavy, Ger. tapfer brave ), from PIE root *dheb dense, firm, compressed … Etymology dictionary
Dapper — Dapper, Olivier, Arzt in Amsterdam, fruchtbarer Schriftsteller auf dem Gebiet der Erdkunde, st. 1690. Außer einer historischen Beschreibung der Stadt Amsterdam, Amst. 1663, Fol., u. der holländ. Übersetzung Herodots, ebd. 1665, sind seine… … Pierer’s Universal-Lexikon
Dapper — Dapper, Olfert, Arzt und geograph. Schriftsteller, lebte meist in Amsterdam und starb 1690. Er lieferte (nach teilweise sehr selten gewordenen Quellen) Beschreibungen von Syrien und Palästina (Rotterd. 1667; deutsch, Amsterd. 1681), von Ägypten,… … Meyers Großes Konversations-Lexikon
dapper — [adj] well groomed, neat bandbox, brisk, chic, chichi, classy, clean, dainty, dashing, doggy*, dressed to kill*, dressed to nines*, jaunty, natty, nice, nifty, nimble, nobby, posh, prim, rakish, ritzy, sassy, sharp, showy, smart, snazzy*, snug,… … New thesaurus
dapper — ► ADJECTIVE ▪ (of a man) neat in dress and appearance. ORIGIN probably from a Low German or Dutch word meaning strong, stout … English terms dictionary
Dapper — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. Dapper peut désigner : Olfert Dapper, un humaniste hollandais du XVIIe siècle le Musée Dapper, un musée parisien consacré aux arts africains… … Wikipédia en Français
dapper — dapperly, adv. dapperness, n. /dap euhr/, adj. 1. neat; trim; smart: He looked very dapper in his new suit. 2. lively and brisk: to walk with a dapper step. 3. small and active. [1400 50; late ME daper Universalium
dapper
1 dapper
2 dapper
3 dapper
4 dapper
5 dapper
6 dapper
7 dapper
8 dapper
9 dapper
10 dapper
11 dapper
12 dapper
13 dapper
14 dapper
15 dapper
16 dapper
17 dapper
18 dapper
См. также в других словарях:
Dapper — may refer to: People Olfert Dapper (1635 1689), Dutch physician and writer Marco Dapper (born 1983), American actor and model Cliff Dapper (born 1920), former Major League Baseball catcher Places Musée Dapper, a Parisian museum specializing in… … Wikipedia
Dapper — Dap per, a. [OE. daper; prob. fr. D. dapper brave, valiant; akin to G. tapfer brave, OHG. taphar heavy, weighty, OSlav. dobr[u^] good, Russ. dobrui. Cf.
Dapper — steht für: Carl von Dapper (1863–1937), ein deutscher Internist und Kurarzt Olfert Dapper (* ca. 1635–1637; † 1689), niederländischer Mediziner und Schriftsteller Ubuntu 6.06, eine Linux Distribution mit dem Codenamen Dapper Drake (Adretter… … Deutsch Wikipedia
dapper — mid 15c., elegant, from M.Du. or M.L.G. dapper bold, strong, sturdy, later quick, nimble, from P.Gmc. *dapraz, perhaps with ironical shift of meaning (Cf. O.H.G. tapfar heavy, Ger. tapfer brave ), from PIE root *dheb dense, firm, compressed … Etymology dictionary
Dapper — Dapper, Olivier, Arzt in Amsterdam, fruchtbarer Schriftsteller auf dem Gebiet der Erdkunde, st. 1690. Außer einer historischen Beschreibung der Stadt Amsterdam, Amst. 1663, Fol., u. der holländ. Übersetzung Herodots, ebd. 1665, sind seine… … Pierer’s Universal-Lexikon
Dapper — Dapper, Olfert, Arzt und geograph. Schriftsteller, lebte meist in Amsterdam und starb 1690. Er lieferte (nach teilweise sehr selten gewordenen Quellen) Beschreibungen von Syrien und Palästina (Rotterd. 1667; deutsch, Amsterd. 1681), von Ägypten,… … Meyers Großes Konversations-Lexikon
dapper — [adj] well groomed, neat bandbox, brisk, chic, chichi, classy, clean, dainty, dashing, doggy*, dressed to kill*, dressed to nines*, jaunty, natty, nice, nifty, nimble, nobby, posh, prim, rakish, ritzy, sassy, sharp, showy, smart, snazzy*, snug,… … New thesaurus
dapper — ► ADJECTIVE ▪ (of a man) neat in dress and appearance. ORIGIN probably from a Low German or Dutch word meaning strong, stout … English terms dictionary
Dapper — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. Dapper peut désigner : Olfert Dapper, un humaniste hollandais du XVIIe siècle le Musée Dapper, un musée parisien consacré aux arts africains… … Wikipédia en Français
dapper — dapperly, adv. dapperness, n. /dap euhr/, adj. 1. neat; trim; smart: He looked very dapper in his new suit. 2. lively and brisk: to walk with a dapper step. 3. small and active. [1400 50; late ME daper Universalium
После прочтения множества статей и публикаций в блогах, общения с разработчиками и некоторых экспериментов с Dapper я захотела поделиться своими открытиями с вами, особенно с теми, кто, как и я, возможно, слышал о Dapper, но на деле не знает, что это такое, как он работает и почему он так нравится многим людям. Помните, что я ни в коей мере не являюсь экспертом в Dapper. Скажем так: я знаю достаточно, чтобы удовлетворить свое любопытство на данный момент, и надеюсь вызвать у вас интерес к Dapper, чтобы вы потом самостоятельно углубились в изучение этого микро-ORM.
Почему Dapper?
Dapper имеет интересную историю, появившись на свет на одном ресурсе, который, по-видимому, очень хорошо известен вам: Марк Грэвелл (Marc Gravell) и Сэм Саффрон (Sam Saffron) в период своей работы в Stack Overflow создали Dapper, решая проблемы с производительностью на этой платформе. Stack Overflow — это сайт с очень интенсивным трафиком, который неизбежно вызывает озабоченности по поводу производительности. Согласно странице About на Stack Exchange, в 2015 году на Stack Overflow было отмечено 5,7 миллиардов просмотров страниц. В 2011 году Саффрон написал статью в блоге о проделанной им и Грэвеллом работе — «How I Learned to Stop Worrying and Write My Own ORM» (aka.ms/Vqpql6), в которой разъяснялись проблемы с производительностью, имевшиеся у Stack в то время; они были связаны с использованием LINQ to SQL. Затем он подробно обосновал то, почему написание собственного ORM, Dapper, было решением для оптимизации доступа к данным на Stack Overflow. Прошло пять лет, и вот Dapper широко используется как проект с открытым исходным кодом. Грэвелл и член команды Ник Крейвер по-прежнему активно руководят проектом на github.com/StackExchange/dapper-dot-net.
Dapper в общих чертах
Dapper позволяет задействовать ваши навыки в SQL для конструирования запросов и команд в том виде, в каком они должны быть по вашему мнению. Он ближе к «железу», чем стандартный ORM, облегчая усилия в интерпретации таких запросов, как LINQ to EF, в SQL. В Dapper действительно есть некоторые впечатляющие средства преобразования, например возможность разбивать список, передаваемый блоку WHERE IN. Но по большей части SQL, передаваемый вами в Dapper, готов к работе, и запросы попадают в базу данных гораздо быстрее. Если вы хорошо знаете SQL, то, безусловно, напишете настолько производительные команды, насколько это возможно. Для выполнения запросов вы должны создать какой-то тип IDbConnection, например SqlConnection с известной строкой подключения. Затем Dapper с помощью своего API может выполнять запросы за вас и (при условии, что схему результатов запроса можно соотнести со свойствами целевого типа) автоматически создавать и заполнять объекты результатами запроса. Здесь вы получаете еще один существенный выигрыш в производительности: Dapper эффективно кеширует сопоставление, которое стало ему известно, что обеспечивает очень быструю десериализацию последующих запросов. Класс, который я буду заполнять, DapperDesigner (рис. 1), определен для управления дизайнерами, которые шьют очень элегантную одежду.
Рис. 1. Класс DapperDesigner
Проект, где я выполняю запросы, имеет ссылку на Dapper, который я получила через NuGet (командой install-package dapper). Вот пример вызова из Dapper для выполнения запроса на получение всех строк из таблицы DapperDesigners:
Заметьте, что в листингах кода в этой статье я использую select * вместо явного проецирования полей для запросов, когда мне нужны все столбцы из таблицы. Переменная sqlConn — это существующий объект SqlConnection, экземпляр которого я уже создала наряду с его строкой подключения, но пока не открыла.
Query — метод расширения, предоставляемый Dapper. Когда выполняется эта строка, Dapper открывает соединение, создает DbCommand, выполняет запрос именно так, как я написала его, создает экземпляр объекта DapperDesigner для каждой строки в результатах и помещает значения из результатов запроса в свойства этих объектов. Dapper может соотносить значения результатов со свойствами посредством нескольких шаблонов, даже если имена свойств не совпадают с именами полей и даже если свойства не находятся в том же порядке, что и совпадающие поля. Но читать мысли он не умеет, поэтому не ждите от него понимания задействованных сопоставлений, например многочисленных строковых значений, где порядок или имена полей и свойств не согласованы. Я пыталась проделать несколько замысловатых экспериментов, чтобы понять, как он будет реагировать на такие вещи; кроме того, имеются глобальные параметры, управляющие тем, как Dapper может логически распознавать сопоставления.
Dapper и реляционные запросы
Мои тип DapperDesigner имеет ряд отношений: «один ко многим» (с Products), «один к одному» (ContactInfo) и «многие ко многим» (Clients). Я экспериментировала с выполнением запросов через эти отношения, и Dapper оказался способен обрабатывать их. Это определенно не столь легко, как выражать запрос LINQ to EF с помощью метода Include или даже проекции. Однако мои навыки в TSQL были исчерпаны до предела, потому что за прошедшие годы EF позволила мне так облениться.
Вот пример выдачи запроса через отношение «один ко многим» на SQL, который я использовала бы прямо в базе данных:
Заметьте, что метод Query требует указать оба типа, которые должны быть сконструированы, а также задать возвращаемый тип, выражаемый заключительным параметром-типом (DapperDesigner). Я использую многострочную лямбду, чтобы сначала сконструировать графы, добавить релевантные товары (products) в их родительские объекты дизайнеров, а затем вернуть каждый дизайнер в IEnumerable, возвращаемый методом Query.
Недостаток такого варианта, потребовавшего от меня максимальных усилий в SQL, заключается в том, что результаты становятся плоскими, как при использовании EF-метода Include. Я получу одну строку на каждый продукт с продублированными дизайнерами. В Dapper есть метод MultiQuery, способный возвращать несколько наборов результатов. В сочетании с GridReader из Dapper производительность этих запросов безусловно превосходит таковую у EF-методов Include.
Труднее в кодировании, быстрее в выполнении
Выражение SQL-кода и заполнение релевантных объектов — задачи, которые я позволила EF обрабатывать в фоне, так что это определенно требует больше усилий в кодировании. Но если вы работаете с большими объемами данных и вам важна производительность исполняющей среды, это, разумеется, стоит таких усилий. В моем примере базы данных около 30 000 дизайнеров. Лишь у нескольких из них есть товары. Я проделала некоторые простые эталонные тесты (benchmark tests), где убедилась, что сравниваю одинаковые вещи. Прежде чем рассматривать результаты тестов, обсудим несколько важных моментов, относящихся к тому, как я выполняла эти замеры.
Помните, что по умолчанию EF отслеживает объекты, являющиеся результатами запросов. Это означает, что она создает дополнительные отслеживающие объекты (tracking objects), вызывающих некоторые издержки, и что ей также требуется взаимодействовать с этими отслеживающими объектами. Dapper, напротив, просто помещает результаты в память. Поэтому важно вывести из игры отслеживание изменений EF при любых сравнениях производительности. Для этого я определяю все свои EF-запросы с методом AsNoTracking. Кроме того, сравнивая производительность, вы должны применять ряд стандартных шаблонов эталонных тестов, такие как подготовка («разогрев») базы данных, многократное повторение запроса и отбрасывание самых низких и самых высоких результатов. Все детали того, как я создавала свои эталонные тесты, вы увидите в пакете исходного кода, сопутствующем этой статье. Тем не менее, я считаю эти эталонные тесты «облегченными», так как они дают лишь некоторое представление о различиях. Для серьезных эталонных тестов вам понадобилось бы гораздо больше итераций, чем мои 25 (от 500 и выше), и учет производительности системы, в которой вы работаете. Я выполняла эти тесты на лэптопе, используя экземпляр SQL Server LocalDB, поэтому мои результаты пригодны лишь для сравнения.
Показатели, которые я отслеживала в своих тестах, — это время выполнения запроса и время формирования результатов. Создание соединений или объектов DbContext не учитывалось. DbContext используется повторно, чтобы не принимать во внимание время, затрачиваемое EF на создание модели в памяти, так как это происходило бы лишь раз для каждого экземпляра приложения, а не для каждого запроса.
На рис. 2 показаны тесты «select *» для запросов Dapper и EF LINQ, так что вы можете понять базовую конструкцию моих шаблонов тестирования. Заметьте, что, помимо сбора самих показателей, я записываю время каждой итерации в список (с именем times) для последующего анализа.
Рис. 2. Тесты для сравнения EF и Dapper при запросе всех DapperDesigner
Стоит отметить еще один момент, касающийся сравнения одинаковых вещей. Dapper принимает чистый SQL. По умолчанию EF-запросы выражаются с помощью LINQ to EF и должны подвергаться некоторой обработке для создания SQL-кода за вас. Как только этот SQL создан, даже если он полагается на параметры, он кешируется в памяти приложения, из-за чего при повторении издержки уменьшаются. Кроме того, EF способна выполнять запросы, использующие чистый SQL, поэтому я приняла во внимание оба подхода. В табл. 1 перечислены сравнительные результаты четырех наборов тестов. В сопутствующем этой статье пакете исходного кода содержится еще больше тестов.
Табл. 1. Среднее время (в мс) выполнения запроса и заполнения объекта на основе 25 итераций с исключением самого быстрого и самого медленного результата
* Запросы с AsNoTracking | Отношение | LINQ to EF* | Чистый SQL, EF* | Чистый SQL, Dapper |
Все дизайнеры (30 000 строк) | – | 96 | 98 | 77 |
Все дизайнеры с товарами (30 000 строк) | 1 : * | 251 | 107 | 91 |
Все дизайнеры с клиентами (30 000 строк) | * : * | 255 | 106 | 63 |
Все дизайнеры с Contact (30 000 строк) | 1 : 1 | 322 | 122 | 116 |
В сценариях, показанных в табл. 1, легко убедиться в преимуществе использования Dapper по сравнению с LINQ to Entities. Но небольшие различия между чистыми SQL-запросами могут не всегда оправдывать переход на Dapper для конкретных задач в системе, где вы в остальных случаях используете EF. Естественно, ваши требования будут другими и могут повлиять на меру различий между EF-запросами и Dapper. Однако в системе с интенсивным трафиком вроде Stack Overflow даже пара миллисекунд экономии на каждом запросе может оказаться крайне существенной.
Dapper и EF для других требований
До сих пор я замеряла простые запросы, где просто извлекаются все столбцы из таблицы, которые точно соответствуют свойствам возвращаемых типов. А как быть, если вы проецируете запросы на типы? Пока схема результатов совпадает с типом, Dapper не видит никакой разницы при создании объектов. Но EF приходится поработать больше, если результаты проекции не совпадают с типом, который является частью модели.
DapperDesignerContext имеет DbSet для типа DapperDesigner. В моей системе есть другой тип, MiniDesigner, который имеет подмножество свойств DapperDesigner:
MiniDesigner не является частью моей EF-модели данных, поэтому DapperDesignerContext ничего не знает об этом типе. Я обнаружила, что запрос всех 30 000 строк и их проецирование на 30 000 объектов MiniDesigner на 25% быстрее в случае Dapper, чем в случае EF, использующей чистый SQL. И вновь для принятия решений конкретно в вашей системе я рекомендую выполнить собственное профилирование производительности.
Dapper также можно использовать для передачи данных в базу данных с помощью методов, позволяющих вам идентифицировать, какие свойства следует применять для параметров, указанных командой, будь то чистая SQL-команда INSERT/UPDATE или вызов функции/хранимой процедуры в базе данных. Для этих задач я не делала никаких сравнений по производительности.
Гибрид «Dapper плюс EF» в реальном мире
Существует очень много систем, которые на 100% используют Dapper для сохранения данных. Но вспомните, что у меня интерес возник из-за того, что разработчики говорили о гибридных решениях. В некоторых случаях это системы с EF, где нужно оптимизировать конкретные проблемные области. В других случаях группы предпочитают использовать Dapper для всех запросов, а EF для всех операций сохранения.
В ответ на мои вопросы по этому поводу в Twitter я получила самые разнообразные отклики.
@garypochron сказал мне, что его группа «собирается задействовать Dapper в областях, где наблюдается высокая интенсивность вызовов и очень частое использование файлов ресурсов». Я изумилась, узнав, что Саймон Хьюз (Simon Hughes) (@s1monhughes), автор популярного проекта EF Reverse POCO Generator, движется в противоположном направлении: по умолчанию везде применяет Dapper и использует EF только для решения изощренных задач. Он сказал мне, что «использует Dapper везде, где только можно. Если же я имею дело со сложной операцией обновления, то перехожу на EF».
Я также видела множество дискуссий о том, где применение гибридного подхода стимулируется разделением обязанностей, а не повышением производительности. Чаще всего в решениях используется надежность ASP.NET Identity в EF, а Dapper применяется для всех остальных операций с базами данных.
Более прямая работа с базой данных имеет и другие преимущества помимо производительности. Роб Салливан (Rob Sullivan) (@datachomp) и Майк Кэмпбелл (Mike Campbell) (@angrypets), эксперты в области SQL Server, любят Dapper. Роб указывает, что вы получаете возможность задействовать такую функциональность баз данных, к которой EF не дает доступа, например полнотекстовый поиск. В конечном счете эта функциональность на самом деле связана с производительностью.
С другой стороны, есть вещи, которые позволяет делать EF, а Dapper — нет, и это не только отслеживание изменений. Хороший пример — возможность выполнять миграции базы данных по мере изменения модели с помощью EF Code First Migrations (чем я и воспользовалась при создании решения для этой статьи).
Однако Dapper не подходит всем и каждому. @damiangray сказал мне, что Dapper не годится для его решения, поскольку ему нужно возвращать IQueryable-объекты из одной части системы в другую, а не сами данные. Эта тематика, отложенное выполнение запросов (deferred query execution), поднималась в репозитарии GitHub для Dapper по ссылке bit.ly/22CJzJl, если вас интересуют подробности. При проектировании гибридной системы хорошей идеей является использование какой-либо разновидности архитектуры Command Query Separation (CQS), где вы создаете раздельные модели для конкретных типов транзакций (как раз то, к чему я всегда стремлюсь). Тем самым вы не пытаетесь создавать код для доступа к данным, достаточно универсальный для работы как с EF, так и с Dapper, в котором зачастую приходится жертвовать преимуществами каждого из этих ORM. Когда я работала над этой статьей, Курт Доусвелл (Kurt Dowswell) опубликовал статью «Dapper, EF and CQS» (bit.ly/1LEjYvA). Очень удачно и для меня, и для вас.
Для тех, кто ожидает CoreCLR и ASP.NET Core, полезно знать, что в Dapper включена и их поддержка. Более подробную информацию вы найдете в репозитарии GitHub для Dapper по ссылке bit.ly/1T5m5Ko.
Итак, я посмотрела Dapper. Что я думаю?
Каковы мои мысли насчет Dapper? Я сожалею, что не нашла время посмотреть Dapper раньше, и счастлива, что наконец-то сделала это. Я всегда рекомендовала применение AsNoTracking или использование представлений либо процедур в базе данных для смягчения остроты проблем с производительностью. Это никогда не подводило ни меня, ни моих клиентов. Но теперь у меня появился другой туз в рукаве, который я намерена рекомендовать разработчикам, заинтересованным выжать еще капельку производительности из своих систем, использующих EF. Это не панацея на все случаи жизни. Моя рекомендация будет заключаться в том, чтобы исследовать Dapper, замерить разницу в производительности (при больших масштабах) и найти баланс между производительностью и тяжестью кодирования. Примите во внимание очевидный шаблон использования Stack Overflow: запросы вопросов, комментариев и ответов, затем возврат графов одного вопроса с комментариями и ответами наряду с некоторыми метаданными (правками) и информацией о пользователе. Они выполняют одни и те же типы запросов и сопоставляют одну и ту же форму результатов снова и снова. Dapper блистает при таком типе повторяющихся запросов, с каждым разом становясь все интеллектуальнее и быстрее. Даже если у вас нет системы с невероятным количеством транзакций, на которое рассчитан Dapper, вы скорее всего обнаружите, что гибридное решение дает вам как раз то, что нужно.
Выражаю благодарность за рецензирование статьи экспертам Stack Overflow Нику Крейверу (Nick Craver) и Марку Грэвеллу (Marc Gravell).