在netcore中 EFCORE的注册使用方式
在netcore中,我们如果想要使用 一个类,那么常见的 是如下的依赖注入的方式:
private readonly MyDbContext _context; public TestBackService(MyDbContext context) { _context = context; }
这时候就会出现问题,如果此时的类的生命周期和数据库上下文的生命周期是一样的,那么这样用是没有问题的。如果是生命周期不同,则会报错!
参照上一篇后台任务:如果我们这个是写在后台任务类中的,那么就会报错,因为我们后台任务是单例模式的生命周期,context是瞬态的生命周期
总结2种解决方案:
方案1:
private readonly IServiceScope serviceScope; private readonly MyDbContext _context; public TestBackService(IServiceProvider service) { serviceScope = service.CreateScope(); _context = serviceScope.ServiceProvider.GetRequiredService<MyDbContext>(); }
这样就可以使用 _context上下文对象了
方案2:
private readonly IServiceProvider service; public TestBackService(IServiceProvider service) { this.service = service; }
这样的话,使用的时候,还需要如下这样在类种写
using (IServiceScope serviceScope = service.CreateScope()) //解决方案2写法 { var _context = serviceScope.ServiceProvider.GetRequiredService<MyDbContext>(); var clubs = _context.Clubs.ToList(); foreach (var item in clubs) { Console.WriteLine(item.Name); } //clubs.Add(new Club { Name="塞维利亚",City="塞维利亚",DateOfEstablishment=Convert.ToDateTime("1902-4-1"),History="一家历史悠久的俱乐部"}); //等待5s await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); }
其实2种写法实质一样,都是先转换生命周期类型,然后再进行使用!!!
posted on 2022-07-28 10:58 泰坦尼克号上的活龙虾 阅读(134) 评论(0) 收藏 举报