You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Blazor WebAssembly+gRPC项目添加CRUD,解决DbContext引用报错

解决方案
  • 首选方案(符合最佳实践)
    你大概率误解了教程的分层要求:gRPC服务的实现属于服务端独有的业务逻辑,原本就不需要放在Shared项目中。Shared项目仅需存放Client和Server两端共用的.proto文件、DTO模型、gRPC自动生成的服务基类/客户端定义即可。
    你只需要把CertificatesService类整体迁移到Server项目中,引用CertPortalContext对应的命名空间,即可直接解决找不到上下文的报错。
    迁移完成后在Server项目的Program.cs中完成相关注册即可:
// 注册DbContext工厂
builder.Services.AddDbContextFactory<CertPortalContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("你的连接字符串Key")));
// 注册gRPC服务
builder.Services.AddGrpc();

// ... 中间件配置部分 ...

// 映射gRPC服务端点
app.MapGrpcService<CertificatesService>();

Client端依旧通过Shared项目中的gRPC客户端定义调用服务,整个流程不受影响,也完全符合Blazor WASM托管项目的分层规范。

  • 备选方案(特殊场景使用)
    如果确实有必须把服务实现放在Shared项目的需求,可以做接口层抽象:

    1. 在Shared项目中定义ICertPortalContext接口,声明你需要用到的所有DbSet<>属性
    2. 让Server项目中的CertPortalContext实现该抽象接口
    3. 将CertificatesService中注入的类型替换为IDbContextFactory<ICertPortalContext>
      该方案可以避免把具体的DbContext实现暴露到Shared层,但会增加额外的抽象代码,无特殊需求不建议使用。
  • 不推荐方案
    不要直接把DbContext移到Shared项目,这会导致EF Core的相关依赖被带到Client端,无端增大WASM应用的加载体积,完全不符合Blazor托管项目的分层规范。

内容的提问来源于stack exchange,提问作者Trevor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 10:18:02