ASP.NET Core MVC调用Controller添加元素后List为空如何解决
问题原因
- ASP.NET Core 中 Controller 默认是瞬态生命周期,每收到一次HTTP请求,都会创建一个全新的
HomeController实例 - 你当前在
HomeController的构造函数中每次都手动new JobRepository(),每次请求拿到的都是全新的JobRepository实例,其内部的jobs列表会重新初始化,自然无法保留之前请求添加的数据
解决方案
方案1:依赖注入注册单例服务(推荐)
利用ASP.NET Core内置依赖注入框架,将JobRepository注册为全局单例,所有请求共享同一个实例:
- 改造
HomeController构造函数,改为依赖注入获取JobRepository实例,不要手动new:
[Route("[controller]/[action]")] public class HomeController : Controller { private readonly JobRepository _jobRepository; // 构造函数注入 public HomeController(JobRepository jobRepository) { _jobRepository = jobRepository; } [HttpPost] public IActionResult AddJob(int job) { return Ok(_jobRepository.AddJob(job)); } [HttpGet] public IActionResult GetAllJobs() { return Ok(_jobRepository.GetAllJobs()); } }
- 在应用启动配置类中注册单例服务,.NET 6+版本在
Program.cs中添加如下代码:
var builder = WebApplication.CreateBuilder(args); // 注册JobRepository为单例生命周期 builder.Services.AddSingleton<JobRepository>(); // 其余服务注册、中间件配置保持不变
如果是.NET 5及更早版本,在Startup.cs的ConfigureServices方法中添加上述服务注册代码即可。
方案2:将存储列表改为静态字段(仅临时测试用,不推荐)
将JobRepository中的jobs字段改为static静态字段,静态字段属于类级别,所有实例共享,不会随实例初始化重置:
public class JobRepository { // 加static关键字改为静态字段 static List<int> jobs = new List<int>(); public int AddJob(int job) { jobs.Add(job); return job; } public List<int> GetAllJobs() { return jobs; } }
注意:静态字段生命周期和应用进程一致,多线程并发操作时需要加锁避免线程安全问题,且不方便单元测试,仅适合临时测试使用。
额外注意事项
- 上述两种方案都是将数据存在内存中,应用重启、部署更新都会丢失数据,如果需要持久化存储请对接数据库、Redis等持久化组件
- 高并发场景下操作共享集合时,建议使用线程安全集合(如
ConcurrentBag<int>)代替普通List<int>,避免并发异常
内容的提问来源于stack exchange,提问作者Saghar Francis
相关产品推荐
相关产品推荐

