Blazor服务器:将EFCoreDbContextFactory与DbContext混合使用

c#

我正在为现有域层构建 Blazor 服务器前端。这一层提供了各种可注入的服务来对 EF Core 存储库进行修改。为此,服务本身从(标准 Microsoft)DI 容器请求 DbContext。这适用于具有作用域 DbContext 实例的常规 MVC.NET/Razor 页面,但如文档所述,这在 Blazor 中存在问题。在 Blazor 服务器应用程序中,我们希望使用 DbContextFactory 来为操作生成短期 DbContext 实例。

在同一个应用程序中同时拥有 DbContext 和 DbContextFactory 没有问题,但我很难理解如何调整我的服务。或者,如果我什至需要?为了说明,这是当前的代码:

我的页面:

@page “/items”
@inject ItemService ItemService

// somewhere in the code
    ItemService.DoOperation(…)
@page “/items”
@inject ItemService ItemService

// somewhere in the code
    ItemService.DoOperation(…)

我的服务

启动.cs:

class ItemService
{
    public ItemService(MyDbContext myDbContext)
    {
        …
    }

    public bool DoOperation(…)
    {
        …
        _myDbContext.SaveChanges();
    }
}

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

回答

在典型的 MVC 应用程序中,一个请求代表一个工作单元。DbContext 作为范围服务生成并通过构造函数注入。这可以。

另一方面,在 Blazor 服务器中,一个请求不再代表单个工作单元。第一个请求创建一个电路,这意味着注入的任何范围服务都将具有此处所述的生命周期。

在 Blazor 服务器应用中,工作单元是 SignalR 消息。(例如,单击按钮可向数据库添加新行)。因此,直接注入您的上下文不是要走的路。

这就是 Blazor Server 具有IDbContextFactory<T>. 像这样初始化它:

services.AddDbContextFactory<DbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("WebDB")));

在您的 Razor 组件(绑定到 Blazor 应用程序)中,您可以像这样使用它:

private readonly IDbContextFactory<DbContext> factory;

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

public void Click()
{
    using(DbContext cnt = factory.CreateDbContext())
    {
    // Your code here
    }
}

这将在此处进一步解释。

文档:带有 Entity Framework Core (EFCore) 的 ASP.NET Core Blazor 服务器。


以上是Blazor服务器:将EFCoreDbContextFactory与DbContext混合使用的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>