如何为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项目的需求,可以做接口层抽象:- 在Shared项目中定义
ICertPortalContext接口,声明你需要用到的所有DbSet<>属性 - 让Server项目中的
CertPortalContext实现该抽象接口 - 将
CertificatesService中注入的类型替换为IDbContextFactory<ICertPortalContext>
该方案可以避免把具体的DbContext实现暴露到Shared层,但会增加额外的抽象代码,无特殊需求不建议使用。
- 在Shared项目中定义
不推荐方案
不要直接把DbContext移到Shared项目,这会导致EF Core的相关依赖被带到Client端,无端增大WASM应用的加载体积,完全不符合Blazor托管项目的分层规范。
内容的提问来源于stack exchange,提问作者Trevor
相关产品推荐
相关产品推荐

