如何在同一解决方案的gRPC与API项目中注册共享服务?
问题解决
错误原因很明确:CreditService的构造函数依赖ICoreService,但你的gRPC项目依赖注入容器中未注册ICoreService的实现类,而API项目中已经完成了该依赖的注册,因此仅gRPC项目启动时会触发此错误。
解决步骤
- 添加
ICoreService的注册
在gRPC项目的program.cs中,注册ICreditService之前,先添加ICoreService的注册代码:
builder.Services.AddScoped<ICoreService, CoreService>(); builder.Services.AddScoped<ICreditService, CreditService>();
- 补充其他依赖项
CoreService大概率还依赖其他服务(比如ISmsPanelContext、各类Repository等),你需要把API项目中所有CreditService依赖链上的服务都注册到gRPC项目的DI容器中,否则会出现新的依赖缺失错误。例如至少需要添加:
builder.Services.AddScoped<ISmsPanelContext, SmsPanelContext>(); // 参照API项目中的配置,补充所有CoreService依赖的Repository和服务注册
优化建议
为了避免API和gRPC项目重复编写DI注册代码,可将通用的服务注册逻辑封装成扩展方法,放在一个共享类库中,两个项目直接调用该方法即可:
// 共享类库中的扩展方法 public static class ServiceCollectionExtensions { public static IServiceCollection AddSharedServices(this IServiceCollection services) { services.AddHttpContextAccessor(); services.AddScoped<ISmsPanelContext, SmsPanelContext>(); // 所有通用的Repository和服务注册都放在这里 services.AddScoped<ICoreService, CoreService>(); services.AddScoped<ICreditService, CreditService>(); return services; } }
然后在API和gRPC项目中调用:
// API项目program.cs builder.Services.AddSharedServices(); // 再添加API特有的服务 // gRPC项目program.cs builder.Services.AddSharedServices(); // 再添加gRPC特有的服务(比如Grpc相关配置)
内容的提问来源于stack exchange,提问作者Soheil
相关产品推荐
相关产品推荐

