Blazor、对象生命周期和依赖注入

Posted

技术标签:

【中文标题】Blazor、对象生命周期和依赖注入【英文标题】:Blazor, Object Life Time and Dependency Injection 【发布时间】:2020-09-08 14:36:48 【问题描述】:

我正在处理我的第一个 Blazor 项目,我遇到了一个关于对象生命周期的问题。

确切的问题是我的 EF DbContext 永远不会被释放,因此在第一次数据库更新后,任何后续更新都会失败,因为异常告诉我该实体已被上下文跟踪。

所以经过调查,我发现所有依赖注入服务都在应用启动时得到解决,并且永远不会被释放,DbContext 也是作为 UnitOfWork 注入的

在 MVC 中,端点对象会在调用结束时被释放,因此 DbContext 会被释放,并且永远不会发生此问题。

但在 Blazor 中,对象的生命周期是不同的。作为一种好的做法,我应该在需要时手动解析DbContext,还是错过了什么?

编辑: 我还应该补充一点,我的DbContext 被添加到IServiceCollectionScoped

【问题讨论】:

您到底是如何注入 DbContext 的?发布代码。请。 services.AddDbContext(options); 【参考方案1】:

Blazor 没有服务器所拥有的方便的请求范围。

你应该自己管理上下文,你不能(完全)把它留给 DI。

This page 向您展示如何选择

在方法范围内管理上下文,使用using( ... ) 或使用@implements IDisposable 将其链接到组件生命周期

在这两种情况下,您都可以使用 DbContextFactory(EF5 中的标准问题)来创建它,同时使用已注册的配置选项。

所以永远不要注入 DbContext 本身。

【讨论】:

那是我第一次创建工厂模式。它就像一个魅力!

以上是关于Blazor、对象生命周期和依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

Webx框架:依赖注入

详解.NET Core 依赖注入生命周期

Mybatis作用域(Scope)和生命周期

最通俗易懂的依赖注入之生命周期

.NET Core 依赖注入生命周期

quarkus依赖注入之七:生命周期回调