接入数据访问骨架
本页负责在最小后端骨架上补出“数据访问该从哪里接”的最小结构。当前不直接接真实数据库,而是先把仓储接口、模型和注册位置固定下来,后续再把内存实现替换成 Dapper / SQL。
这篇教程解决什么
- Repository 应该挂在哪一层。
- 为什么教程先用内存实现承接接口,而不是一上来就接数据库。
- 将来切到 Dapper / SQL 时应该替换哪些位置。
前置条件
- 已完成 接入 WebAPI 基础能力。
- 已能访问
/api/demo/hello。
配套代码
- 当前样例:backend-starter
- 当前关注文件:IWeatherQueryRepository.cs
- 当前关注文件:InMemoryWeatherQueryRepository.cs
- 当前关注文件:WeatherSnapshot.cs
我们要做的事
- 给控制器引入明确的 Repository 依赖。
- 先用内存实现完成最小闭环。
- 固定后续替换成 Dapper / SQL 时的边界。
操作步骤
- 新增一个最小业务模型:
public sealed record WeatherSnapshot(string City, int TemperatureC, string Condition);
- 新增 Repository 接口:
public interface IWeatherQueryRepository
{
WeatherSnapshot GetToday();
}
- 先用内存实现承接接口,而不是直接把数据访问逻辑写到控制器里:
public sealed class InMemoryWeatherQueryRepository : IWeatherQueryRepository
{
public WeatherSnapshot GetToday()
{
return new WeatherSnapshot("Shanghai", 26, "Cloudy");
}
}
- 在 Program.cs 中注册这个 Repository:
builder.Services.AddScoped<IWeatherQueryRepository, InMemoryWeatherQueryRepository>();
让控制器通过构造函数依赖它,而不是手工 new 或直接写死数据。
如果你后面要切到 Dapper / SQL,保持接口不变,只替换实现和注册。例如:
builder.Services.AddScoped<IWeatherQueryRepository, SqlWeatherQueryRepository>();
验证结果
DemoController已经不再手写假数据,而是通过IWeatherQueryRepository获取结果。- Repository 已经被注册为
Scoped。 - 后续接真实数据库时,只需要替换实现,不需要重写控制器和路由。