【发布时间】:2022-01-17 01:26:37
【问题描述】:
我有一个需要间接连接到 EF 核心数据库上下文的 blazor 服务器应用程序。
所有 blazor 组件都不会直接注入 dbcontext 的实例。我正在使用调解员来处理所有业务操作。
目前我看到的文档建议使用 IDbContextFactory。我试了一下,但我没有看到工厂创建的 DbContext 被处置。注入 IDbContext 的服务不会在页面更改时或任何其他时间释放。
public class QueryHandler : IQueryHandler<Query, Entity>, IDisposable
{
private readonly DbContext dbContext;
public QueryHandler(IDbContextFactory factory)
{
dbContext = factory.CreateDbContext();
}
public Task Handle(Query query)
{
/// do whatever needs to be done.
}
public void Dispose()
{
dbContext.Dispose(); // <-- Dispose never gets called.
}
}
我错过了什么吗?
【问题讨论】:
-
这与 EF Core 和
IDbContextFactory无关。据我了解,问题是您的QueryHandler未处理。 -
我正在使用 Microsoft.Extensions.DependencyInjection。据我了解,它会根据服务的注册范围自动处置服务。
-
范围是多少?在 Blazor Server 中,它是客户端电路 - 基本上是整个会话
-
有一个新的基础组件有助于控制服务提供者范围的生命周期。
OwningComponentBase&OwningComponentBase<TService>source.dot.net/#Microsoft.AspNetCore.Components/… -
工厂不是一次性的,它创建的对象是一次性的。但是它创建的对象没有在 DI 容器中注册,您有责任处理它们。工厂的标准行为(与使用带有一次性对象的
new运算符相同)。
标签: entity-framework-core blazor