问题描述
我正在开发一个广泛使用实体框架的 blazor 应用程序。我做了一些阅读,表明 DbContext
的默认生命周期不适用于 Blazor(请参阅 https://stackoverflow.com/a/66817764/14024210)。但是,我不打算将上下文直接注入到我的组件中,而是使用将上下文注入到其中的服务。只要上下文存在于我的主要表单组件的生命周期中,就不会有问题。
- 我是否应该将上下文和服务都配置为瞬态?我的理解是,每当组件收到上下文时,这都会提供两者的新实例。
- 我的服务是否需要实现
Idisposable
才能正确处置?或者,如果它唯一的依赖项是DbContext
,这是否没有必要?
简而言之,我想正确实现 DbContext
所针对的“工作单元”概念。
解决方法
当您使用 Blazor WebAssembly 时,这会在服务器上自行解决:每个 API 调用都有一个完全可用的生命周期作为作用域。
对于 Blazor 服务器端,使用 DI 管理 DbContext 很简单not appropriate。
推荐的方法是为每个操作创建一个 DbContext,并使用 using(...) {...}
块对其进行管理。你可以注入一个 DbContextFactory 来帮助配置。
每个组件使用一个 DbContext 可能很诱人,但这会导致 Contexts 保持打开很长时间并增加服务器上的内存使用。这不会很好地扩展,也不鼓励使用服务。
所以,我会为每个服务方法使用一个 DbContext。