agilelabs-fx-docs main tutorials/backend-init/add-data-access.md

接入数据访问骨架

本页负责在最小后端骨架上补出“数据访问该从哪里接”的最小结构。当前不直接接真实数据库,而是先把仓储接口、模型和注册位置固定下来,后续再把内存实现替换成 Dapper / SQL。

这篇教程解决什么

  • Repository 应该挂在哪一层。
  • 为什么教程先用内存实现承接接口,而不是一上来就接数据库。
  • 将来切到 Dapper / SQL 时应该替换哪些位置。

前置条件

配套代码

我们要做的事

  • 给控制器引入明确的 Repository 依赖。
  • 先用内存实现完成最小闭环。
  • 固定后续替换成 Dapper / SQL 时的边界。

操作步骤

  1. 新增一个最小业务模型:
public sealed record WeatherSnapshot(string City, int TemperatureC, string Condition);
  1. 新增 Repository 接口:
public interface IWeatherQueryRepository
{
    WeatherSnapshot GetToday();
}
  1. 先用内存实现承接接口,而不是直接把数据访问逻辑写到控制器里:
public sealed class InMemoryWeatherQueryRepository : IWeatherQueryRepository
{
    public WeatherSnapshot GetToday()
    {
        return new WeatherSnapshot("Shanghai", 26, "Cloudy");
    }
}
  1. Program.cs 中注册这个 Repository:
builder.Services.AddScoped<IWeatherQueryRepository, InMemoryWeatherQueryRepository>();
  1. 让控制器通过构造函数依赖它,而不是手工 new 或直接写死数据。

  2. 如果你后面要切到 Dapper / SQL,保持接口不变,只替换实现和注册。例如:

builder.Services.AddScoped<IWeatherQueryRepository, SqlWeatherQueryRepository>();

验证结果

  • DemoController 已经不再手写假数据,而是通过 IWeatherQueryRepository 获取结果。
  • Repository 已经被注册为 Scoped
  • 后续接真实数据库时,只需要替换实现,不需要重写控制器和路由。

下一篇读什么