【问题标题】:List become empty every time I add an Item on it from Controller每次我从控制器添加项目时,列表都会变为空
【发布时间】:2021-12-27 10:02:58
【问题描述】:

出于实践目的,我开始学习 asp.net core MVC 我创建了一个HomeController,其中我有两种方法

     [Route("[controller]/[action]")]
     public class HomeController : Controller
     {
        private readonly JobRepository _jobRepository;
        public HomeController()
        {
            _jobRepository = new JobRepository();
        }

        [HttpPost]
        public IActionResult AddJob(int job)
        {
            return Ok(_jobRepository.AddJob(job));
        }

        [HttpGet]
        public IActionResult GetAllJobs()
        {
            return Ok(_jobRepository.GetAllJobs());
        }

    }

我在控制器中接收数据,但问题是当数据传输到我的存储库时,我将所有作业保存在 int 列表中

public class JobRepository
    {
        List<int> jobs  = new List<int>();

        public int AddJob(int job)
        {
            jobs.Add(job);
            return job;
        }

        public List<int> GetAllJobs()
        {
            return jobs;
        }
    }

数据已输入到列表中,但当我再次点击控制器时,我的列表会重新初始化,并且列表计数在即时窗口中显示为 1

【问题讨论】:

  • 你能说明你在哪里以及如何使用这两个类吗?
  • 第一个在 HomeController 类,第二个完全是我在这里发布的
  • 每次调用 HomeController 时,都会创建一个新的 jobRepo。您应该使用依赖注入并将 JobRepo 注入 HomeController 作为单例
  • “我在 Startup 类的 ConfigureService 方法中添加了 services.AddSingleton();” - 这不会神奇地使 JobRepository 成为单例,你仍然需要将其注入控制器的构造函数中。
  • 不,你不是,你是用new手动实例化它。这与注入相反。

标签: c# asp.net asp.net-mvc asp.net-web-api


【解决方案1】:
public HomeController()
{
// This instantiates a new instance of JobController,
// it >>does not<< inject one from DI.
    _jobRepository = new JobRepository();
}

这会忽略您的 DI 注册设置。

改为:

// Assuming JobRepository implements IJobRepository (which it should) 
// and it is registered in DI as 
// services.AddSingleton<IJobRepository, JobRepository>();
public HomeController( IJobRepository jobRepository )
{
    _jobRepository = jobRepository;
}

或者没有接口(我不推荐):

public HomeController( JobRepository jobRepository )
{
    _jobRepository = jobRepository;
}

不相关,我也建议添加空检查

public HomeController( JobRepository jobRepository )
{
    _jobRepository = jobRepository ?? throw new ArgumentNullException(nameof(jobRepository));
}

【讨论】:

  • 感谢您和所有其他为我的问题提供时间的人
【解决方案2】:

每次进入 JobRepository 时,它都会创建一个新的 List 对象,因此它将为空 如果您想暂时存储它,请将对象设为静态以避免每次都创建新对象

如果您想要持久性,您可能需要使用数据库和实体框架 参考文档

https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/crud?view=aspnetcore-6.0

【讨论】:

  • 我想保留数据直到我的实例运行。我不想将数据保留在数据库中
  • 那么你真的需要了解 ASP.NET 控制器生命周期是如何工作的,以及如何在会话中存储东西。您的“想要”与 ASP.NET 的工作方式直接矛盾。猜猜谁赢。提示:不是你。是时候坐下来了,RTFM 关于控制器的生命周期并提出一个实际可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多