gpt4 book ai didi

c# - Blazor 服务器 : Mixing EF Core DbContextFactory with DbContext

转载 作者:行者123 更新时间:2023-12-03 21:41:20 29 4
gpt4 key购买 nike

我正在为现有域层构建 Blazor 服务器前端。该层提供各种可注入(inject)服务来对 EF Core 存储库进行修改。为此,服务本身从(标准 Microsoft)DI 容器请求 DbContext。这适用于具有范围 DbContext 实例的常规 MVC.NET/Razor 页面,但作为 documented ,这是 Blazor 的问题。在 Blazor Server 应用程序中,我们希望使用 DbContextFactory 来生成用于操作的短期 DbContext 实例。
在同一个应用程序中同时拥有 DbContext 和 DbContextFactory 没有问题,但我很难理解如何调整我的服务。或者如果我什至需要?为了说明,这是当前代码:
我的页面:

@page “/items”
@inject ItemService ItemService

// somewhere in the code
ItemService.DoOperation(…)
我的服务
class ItemService
{
public ItemService(MyDbContext myDbContext)
{

}

public bool DoOperation(…)
{

_myDbContext.SaveChanges();
}
}
启动.cs:
            services.AddDbContext<MyDbContext>(options => …),
contextLifetime: ServiceLifetime.Transient,
optionsLifetime: ServiceLifetime.Singleton
);

services.AddDbContextFactory<MyDbContext>(options => …);

根据 this answer 中给出的示例,我已经更改了 DbContext 的生命周期。到目前为止,我还没有能够创造任何问题,但我并不完全理解这里的生命周期问题。如何以一种明显的方式设计我的服务以在 Blazor 和 MVC/Razor Pages 应用程序中运行良好?

最佳答案

在典型的 MVC 应用程序中,一个请求代表一个工作单元。 DbContext 作为范围服务生成并通过构造函数注入(inject)。这可以。
另一方面,在 Blazor Server 中,一个请求不再代表单个工作单元。第一个请求创建了一个电路,这意味着注入(inject)的任何作用域服务都将有一个生命周期,如 here 所述。 .
在 Blazor Server 应用中,工作单元是 SignalR 消息。 (例如,单击按钮将新行添加到数据库)。因此,直接注入(inject)您的上下文 is not the way to go .
这就是 Blazor Server 具有 IDbContextFactory<T> 的原因。 .像这样初始化它:

services.AddDbContextFactory<DbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("WebDB")));
在您的 Razor 组件(绑定(bind)到 Blazor 应用程序)中,您可以像这样使用它:
private readonly IDbContextFactory<DbContext> factory;

public Component(IDbContextFactory<DbContext> f)
{
factory = f;
}

public void Click()
{
using(DbContext cnt = factory.CreateDbContext())
{
// Your code here
}
}
这将进一步解释 here .
文档: ASP.NET Core Blazor Server with Entity Framework Core (EFCore) .

关于c# - Blazor 服务器 : Mixing EF Core DbContextFactory with DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67374706/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com