ASP.NET Core将DbContext依赖关系解析为init迁移

时间:2016-07-13 21:31:53

标签: c# dependency-injection asp.net-core .net-core di-containers

非常棒的是,ASP.NET DI开箱即用并递归地解析所有构造函数依赖项。虽然有时您希望能够直接访问DI容器。我想知道是否有办法?也许是这样的:

IService service = Container.Instance.Resolve<IService>();

我在docs中找不到任何内容(虽然我知道,我可以替换内置的DI框架)。

在大多数情况下,你不需要它,但有一些特定的情况。在我的情况下,我需要在应用启动时使用IoC容器初始化我的EF DbContext,以启动应该像EF Core那样工作的自动迁移:

using (var context = new MyContext())
{
    context.Database.Migrate();
}

我的上下文已在容器中注册,但它位于单独的类库中。而且我不想直接称它为DbContextOptions构造函数。

1 个答案:

答案 0 :(得分:3)

在问题得到更新并且很明显它正在进行EntityFramework Core迁移之后,ASP.NET核心团队就如何正确解析{{1在应用程序启动期间。

默认情况下,DbContext被注册为作用域服务,因此每个请求都会实例化一次。应用程序启动期间的问题是,还没有上下文,DbContext方法中只有app.ApplicationServices可用,而Configure提供程序实际上是解析单例(范围是每个范围的单例和只要应用程序确实存在,应用程序范围就会存在。

所以诀窍是首先创建一个范围,解析ApplicationServices,执行操作然后处理上下文(以及DbContext)。

示例可以在MusicStore示例应用程序herehere中找到。

截至目前,这是解决问题的唯一安全方法,不会导致任何问题,即处理对象异常。

另请注意,您可以执行此操作的最早时间点是DbContext方法,因为只有IoC容器才构建完毕。在Configure中,您只会填充ConfigureServices

相关代码片段:

IServiceCollection

修改

有关此问题的其他资源: