繁体   English   中英

AddSingleton 在我的 ASP.NET 核心项目中不起作用

[英]AddSingleton doesn't work in my ASP.NET Core project

我有一个问题,我想将我的服务 CourseService 添加为 Singleton 并且我只想添加一次我的初始数据,如下所示:

context.Courses.Add(new Course { ... });

但事实证明,每次我上传带有课程的页面时,我的初始数据都会一次又一次地添加到我的数据库中。 因此,我在上传此页面的同时在我的页面上看到相同的课程。 无法理解问题出在哪里。

我的界面:

public interface ICourseService
{
    IEnumerable<CourseDto> GetCourses();
    Task<IEnumerable<CourseDto>> GetCoursesAsync();
}

我的服务:

public class CourseService : BaseService<Course, CourseDto>, ICourseService
{
        public CourseService(IMapper mapper, DataContext context) : base(mapper,context)
        {
            context.Courses.Add(new Course { ... });
            context.Courses.Add(new Course { ... });
            context.SaveChanges();
        }

        public IEnumerable<CourseDto> GetCourses() { ... }

        public async Task<IEnumerable<CourseDto>> GetCoursesAsync() { ... }
}

我的 controller:

public class CourseController : Controller
{
        private readonly CourseService _courseService;

        public CourseController(CourseService courseService)
        {
            _courseService = courseService;
        }

        [Route("courses")]
        public async Task<IActionResult> GetCourses()
        {
            var courses = await _courseService.GetAllAsync();
            return View("CourseList", courses);
        }
}

我在 ConfigureServices 方法中将我的服务添加为 Singleton:

services.AddSingleton<ICourseService, CourseService>();
services.AddEntityFrameworkSqlite().AddDbContext<DataContext>();

AddDbContext默认添加Scoped生命周期的上下文,因此在 singleton 服务中无法解析。 可能的解决方法:

  1. ICourseService注册为作用域
  2. 将上下文注册为作用域或瞬态(不推荐)
  3. 注入IServiceScopeFactory并使用它来创建 scope 并从 scope 解析上下文(在每个方法调用上),就像在这个答案中一样

我个人会使用第一种方法 go。

阅读更多:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM