我应该如何为 Blazor 配置实体框架生命周期?

问题描述

我正在开发一个广泛使用实体框架的 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。