如何从控制器中解析ASP NET 5中的EF7当前数据库上下文?

And*_*vin 5 entity-framework-core asp.net-core

我想在ASP NET 5/EF 7应用程序中为每个请求获取一个上下文,以便在某些方法中使用它(不在控制器中).

不幸的是,我没有在文档ASP.NET vNext模板和示例aspnet/MusicStore中找到答案

Sta*_*cev 6

您可以使用某些方法来实现此目的.

使用在依赖注入系统中.AddDbContext<ApplicationDbContext>();注册的方法ApplicationDbContext(在ConfigureServices()方法中),导致它注册为Scoped依赖(或者换言之"每个请求").因此,您只需要从依赖注入系统获取它.

  1. 将dbContext作为构造函数方法的参数添加到您的类中(您将使用dbContext).然后你必须使用依赖注入系统来获得这个类,例如将它添加为控制器构造函数的参数.

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 但是如果你不想使用构造函数注入来获取上下文,你可以使用GetService()方法得到必要的依赖项(但是你需要在ServiceProvider实例中,在下面的例子中,我也可以通过构造函数注入).

    using Microsoft.Framework.DependencyInjection; // for beta 6 and below
    using Microsoft.Extensions.DependencyInjection; // for beta 7 and above
    public class HabitService
    {
        private IServiceProvider _serviceProvider;
    
        public HabitService(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
    
        public GetHabit()
        {
             var dbcontext = _serviceProvider.GetService<ApplicationDbContext>();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在第一种方法中,我们也可以HabitService通过GetService()方法(不是通过构造函数注入).

    using Microsoft.Framework.DependencyInjection; // for beta 6 and below
    using Microsoft.Extensions.DependencyInjection; // for beta 7 and above
    
    public class HabitsController : Controller
    {
        public HabitsController(IServiceProvider serviceProvider)
        {
           var habitService= serviceProvider.GetService<HabitService>();
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

谢谢Tseng的评论:

我应该注意,将容器注入对象是一种非常糟糕的做法.只应从组合根和某些类型的工厂(在应用程序级别实现,而不是在域/业务层中)引用容器


HabitsController中的dbContext和HabitService中的_dbContext是不同的上下文!

我检查过,这是相同的背景.

  • 拒绝`_`使用`this.dbContext = dbContext` (2认同)