Поскольку Dapper является одним из самых быстрых минимальных ORM для .NET, мне было любопытно, как он материализует экземпляры с результатами.
Я предполагаю, что он использует отражение, чтобы собрать все свойства типов возврата и обналичить эту информацию (для последующих звонков (кеш ограничен?)). Я также обнаружил, как работает отображение информации о свойствах (возможно, отраженных) и фактических возвращенных имен столбцов. Но тогда что?
- Использует ли он отражение, чтобы заполнять его данными каждый раз?
- Использует ли он отражение для создания ExpressionTrees (позже скомпилированных), которые заполняют новые экземпляры правильными данными (кэшируются?)?
- Использует ли он IL.emit для создания IL во время выполнения для заполненияновые экземпляры с правильными данными (кэшируются?)
- Это , кажется, имеет место, но не видел весь источник, поэтому не уверен (также см. Вопрос ниже).
Если в нем не используется подход, основанный на отражениях, как он будет устанавливать свойства только для чтения (не может сделать это вне конструктора)? Использует ли он смешанный подход? Это где-нибудь задокументировано?
Я пробовал поискать статьи в Google, но единственное, что я обнаружил, это то, что он использует ADO.NET для фактического взаимодействия с базой данных, десериализации и поиска правильных типов изответ. Я также обнаружил this , но он не предоставил подробных сведений о реализации.
Я также попытался просмотреть исходный код и нашел несколько IL emit имного кода, который ссылался на mapper , но не смог найти именно то, что я искал.