Blazor、对象生命周期和依赖注入
Blazor, Object Life Time and Dependency Injection
我正在处理我的第一个 Blazor 项目,我遇到了一个关于对象生命周期的问题。
确切的问题是我的 EF DbContext
从未被处置,所以在第一次数据库更新后,任何后续更新都会失败,因为异常告诉我实体已经被上下文跟踪。
所以经过调查,我发现所有依赖注入的服务在应用程序启动时都会被解析,并且永远不会被处置,因此 DbContext
作为 UnitOfWork
注入
在 MVC 中,端点对象会在调用结束时被释放,因此 DbContext
被释放,并且永远不会发生此问题。
但在 Blazor 中对象的生命周期是不同的。作为一个好习惯,我应该在需要时手动解决 DbContext
,还是遗漏了什么?
编辑:
我还应该补充一点,我的 DbContext
作为 Scoped
添加到 IServiceCollection
Blazor 没有服务器所具有的方便的请求范围。
你应该自己管理上下文,不能(完全)交给 DI。
This page 向您展示如何
- 管理方法范围内的上下文,
using( ... )
- 或link它与
@implements IDisposable
的组件生命周期
在这两种情况下,您都可以使用 DbContextFactory(EF5 中的标准问题)创建它,同时使用已注册的配置选项。
所以永远不要注入 DbContext 本身。
我正在处理我的第一个 Blazor 项目,我遇到了一个关于对象生命周期的问题。
确切的问题是我的 EF DbContext
从未被处置,所以在第一次数据库更新后,任何后续更新都会失败,因为异常告诉我实体已经被上下文跟踪。
所以经过调查,我发现所有依赖注入的服务在应用程序启动时都会被解析,并且永远不会被处置,因此 DbContext
作为 UnitOfWork
在 MVC 中,端点对象会在调用结束时被释放,因此 DbContext
被释放,并且永远不会发生此问题。
但在 Blazor 中对象的生命周期是不同的。作为一个好习惯,我应该在需要时手动解决 DbContext
,还是遗漏了什么?
编辑:
我还应该补充一点,我的 DbContext
作为 Scoped
IServiceCollection
Blazor 没有服务器所具有的方便的请求范围。
你应该自己管理上下文,不能(完全)交给 DI。
This page 向您展示如何
- 管理方法范围内的上下文,
using( ... )
- 或link它与
@implements IDisposable
的组件生命周期
在这两种情况下,您都可以使用 DbContextFactory(EF5 中的标准问题)创建它,同时使用已注册的配置选项。
所以永远不要注入 DbContext 本身。