在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)    收藏  举报

导航