如何從控制器中解析ASP NET 5中的EF7當前數據庫上下文?


我想在ASP NET 5 / EF 7應用程序中為每個請求獲取一個上下文,以便在某些方法中使用它(不在控制器中)。

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

一般承認的答案

您可以使用某些方法來實現此目的。

使用.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;
        }
    }
    
  2. 但是如果你不想使用構造函數注入來獲取上下文,你可以使用GetService()方法得到必要的依賴項(但是你需要在ServiceProvider實例中,在下面的例子中,我也可以通過構造函數注入)。

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    
  3. 在第一種方法中,我們也可以通過GetService()方法獲取HabitService (而不是通過構造函數注入)。

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    

謝謝Tseng的評論:

我應該注意,將容器注入對像是一種非常糟糕的做法。只應從組合根和某些類型的工廠(在應用程序級別實現,而不是在域/業務層中)引用容器


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

我檢查過,這是相同的背景。





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因