如何在每次请求中复用依赖注入的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
相关产品推荐
相关产品推荐

