Как Dapper материализует экземпляры? - PullRequest
0 голосов
/ 16 октября 2019

Поскольку Dapper является одним из самых быстрых минимальных ORM для .NET, мне было любопытно, как он материализует экземпляры с результатами.

Я предполагаю, что он использует отражение, чтобы собрать все свойства типов возврата и обналичить эту информацию (для последующих звонков (кеш ограничен?)). Я также обнаружил, как работает отображение информации о свойствах (возможно, отраженных) и фактических возвращенных имен столбцов. Но тогда что?

  • Использует ли он отражение, чтобы заполнять его данными каждый раз?
  • Использует ли он отражение для создания ExpressionTrees (позже скомпилированных), которые заполняют новые экземпляры правильными данными (кэшируются?)?
  • Использует ли он IL.emit для создания IL во время выполнения для заполненияновые экземпляры с правильными данными (кэшируются?)
    • Это , кажется, имеет место, но не видел весь источник, поэтому не уверен (также см. Вопрос ниже).

Если в нем не используется подход, основанный на отражениях, как он будет устанавливать свойства только для чтения (не может сделать это вне конструктора)? Использует ли он смешанный подход? Это где-нибудь задокументировано?


Я пробовал поискать статьи в Google, но единственное, что я обнаружил, это то, что он использует ADO.NET для фактического взаимодействия с базой данных, десериализации и поиска правильных типов изответ. Я также обнаружил this , но он не предоставил подробных сведений о реализации.

Я также попытался просмотреть исходный код и нашел несколько IL emit имного кода, который ссылался на mapper , но не смог найти именно то, что я искал.

...