不使用Dapper是什么意思 & Dapper是什么
1. Dapper 是什么
Dapper 是.NET生态里最流行的轻量ORM(对象关系映射)库,Stack‑Overflow开发的,NuGet包名Dapper。
ORM:把数据库表 → C#实体类对象自动映射,不用手写大量
IDataReader读取字段、赋值给Model属性的样板代码。
Dapper典型用法(对比原生写法)
假设表对应实体TItem:
// Dapper写法,简短,不用自己写Reader循环 using var conn = new SQLiteConnection(connectionString); var list = conn.Query<TItem>("select * from TItem where Id=@id", new { id = 1 }).ToList();Dapper帮你做的事:
- 打开连接、参数处理
- 执行SQL
- 自动把DataReader的列,映射到
TItem的属性 - 直接返回实体对象集合,不用手动
reader["字段名"]逐个赋值
底层依旧是原生IDbConnection/IDbCommand,只是做封装,不是新数据库驱动。
2. “不使用Dapper”是什么含义
你的架构:
BaseTableManager<TItem>,直接用原生SQLiteConnection/SQLiteCommand/DataReader,不引入Dapper NuGet包,不调用Dapper扩展方法。
也就是全部手写ADO.NET原生代码,示例模式:
// 原生ADO.NET,不使用Dapper using var cmd = new SQLiteCommand(sql, connection); cmd.Parameters.AddWithValue("@id", 1); using var reader = cmd.ExecuteReader(); var list = new List<TItem>(); while(reader.Read()) { var item = new TItem(); item.Id = (long)reader["Id"]; item.Name = reader["Name"]?.ToString(); // 每一个字段都手动从reader读取,赋值给实体 list.Add(item); }“不使用Dapper”带来的特点
✅ 优点
- 零第三方依赖,项目不需要安装Dapper包;插件场景(CAD插件、桌面程序)程序集更少,避免版本冲突。
- 完全掌控SQL执行、参数、读取逻辑,没有Dapper内部映射黑盒;方便做自定义缓存、特殊类型转换、底层性能调优。
- 适合基类封装,自己实现一套通用的Reader→实体映射逻辑。
❌ 缺点
- 样板代码多:查询每一张表,都要写
while(reader.Read())、手动读取每一列赋值。 - 需要自己封装通用转换逻辑(所以才抽象出
BaseTableManager<TItem>基类,自己手写简易映射代替Dapper)。
3. 和你现有架构的关系
你的BaseTableManager<TItem>抽象基类,本质就是自己造一个简易ORM基类,替代Dapper的映射能力:
- 内部维护缓存字典;
- 自己封装SQLiteConnection/Command;
- 自己处理
DataReader读取字段,反射把reader字段赋值给TItem属性; - 实现增删改查、缓存、保存逻辑。
“不使用Dapper” = 不引用Dapper库,映射逻辑全部自己在基类内部实现,不走Dapper的
Query<T>()扩展方法。
简单对比
| 方式 | 依赖 | 对象映射 |
|---|---|---|
| 使用Dapper | NuGet Dapper包 | 库自动Reader→实体 |
| 你的现有架构 | 仅SQLite驱动 | 自己基类内部反射实现Reader→实体 |
4. 什么时候会纠结要不要引入Dapper
- 如果引入Dapper:基类可以大幅简化,不用手写Reader反射映射;但要多带Dapper程序集,CAD插件环境容易出现依赖版本冲突。
- 如果坚持不使用Dapper:就要完善
BaseTableManager<TItem>,写通用反射工具方法,把DataReader转TItem的逻辑封装到基类,子类只关心SQL。
举个基类内部可写的简易工具(无Dapper):
protected virtual TItem ReadItemFromReader(SQLiteDataReader reader) { // 通过反射读取TItem属性,从reader赋值,自己实现映射,替代Dapper }如果你需要,我可以给一段适配你这个BaseTableManager<TItem>架构的原生Reader反射映射的示例代码。