And*_*vin 5 entity-framework-core asp.net-core
我想在ASP NET 5/EF 7应用程序中为每个请求获取一个上下文,以便在某些方法中使用它(不在控制器中).
不幸的是,我没有在文档ASP.NET vNext模板和示例aspnet/MusicStore中找到答案
您可以使用某些方法来实现此目的.
使用在依赖注入系统中.AddDbContext<ApplicationDbContext>();注册的方法ApplicationDbContext(在ConfigureServices()方法中),导致它注册为Scoped依赖(或者换言之"每个请求").因此,您只需要从依赖注入系统获取它.
将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)但是如果你不想使用构造函数注入来获取上下文,你可以使用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)在第一种方法中,我们也可以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是不同的上下文!
我检查过,这是相同的背景.
| 归档时间: |
|
| 查看次数: |
3434 次 |
| 最近记录: |