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