You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在每次请求中复用依赖注入的Repository实例

问题解决:Repository每次请求重置的问题

问题根源

你注册的IBookRepository是Scoped生命周期,ASP.NET Core中Scoped服务会为每个HTTP请求创建新实例,导致每次页面请求(查看全部/添加)都会新建BookRepository,内存里的List<Book>自然就重置了。另外,控制器通过IServiceProvider获取服务的方式也没必要,直接构造注入更规范。

解决方案

1. 更改Repository的生命周期为Singleton

Singleton服务在应用启动时创建,整个应用生命周期内只有一个实例,确保List<Book>的数据在请求间保留。修改Program.cs的注册代码:

// Add services to the container.
builder.Services.AddControllersWithViews();

builder.Services.AddScoped<IUserRepository, UserRepository>();
// 把AddScoped改成AddSingleton
builder.Services.AddSingleton<IBookRepository, BookRepository>();

var app = builder.Build();

注意:Singleton服务要考虑线程安全,多个请求会同时访问它。如果是学习用可以暂时忽略,若要实际使用,需要给_books的操作加锁(比如lock(_books))避免并发问题。

2. 优化控制器的依赖注入方式

直接在构造函数中注入IBookRepository,这是依赖注入的最佳实践,比通过IServiceProvider获取更简洁:

private readonly IBookRepository _bookRepository;

public LibraryController(IBookRepository bookRepository)
{
    _bookRepository = bookRepository ?? throw new ArgumentNullException(nameof(bookRepository));
}

3. 可选:初始化测试数据

如果想启动时就有默认数据,可以在BookRepository的构造函数里添加:

public BookRepository()
{
    _books = new List<Book>
    {
        new Book { ISBN = "978-7-111-54493-7", Title = "C# 高级编程", Author = "Andrew Troelsen" },
        new Book { ISBN = "978-7-121-39400-9", Title = "ASP.NET Core 实战", Author = "杨中科" }
    };
}

效果验证

修改后,BookRepository只会被创建一次,所有请求共享同一个实例,List<Book>里的数据会在页面跳转时保留,不会再重置。

内容的提问来源于stack exchange,提问作者Kalacia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:35:57