非常棒的是,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
构造函数。
答案 0 :(得分:3)
在问题得到更新并且很明显它正在进行EntityFramework Core迁移之后,ASP.NET核心团队就如何正确解析{{1在应用程序启动期间。
默认情况下,DbContext
被注册为作用域服务,因此每个请求都会实例化一次。应用程序启动期间的问题是,还没有上下文,DbContext
方法中只有app.ApplicationServices
可用,而Configure
提供程序实际上是解析单例(范围是每个范围的单例和只要应用程序确实存在,应用程序范围就会存在。
所以诀窍是首先创建一个范围,解析ApplicationServices
,执行操作然后处理上下文(以及DbContext
)。
示例可以在MusicStore示例应用程序here和here中找到。
截至目前,这是解决问题的唯一安全方法,不会导致任何问题,即处理对象异常。
另请注意,您可以执行此操作的最早时间点是DbContext
方法,因为只有IoC容器才构建完毕。在Configure
中,您只会填充ConfigureServices
。
相关代码片段:
IServiceCollection
修改强>
有关此问题的其他资源: