Blazor Server应用执行存储过程及服务注入异常处理
你在Razor组件里写的@inject语句服务类型和属性名顺序写反了,直接导致DI容器解析服务时匹配不到注册项。
Blazor的@inject语法规则为:
@inject <要解析的服务类型> <组件内接收实例的属性名>
你当前在CalculateItemImportance.razor里的写法是:
@inject CalculateImportanceService ICalculateImportanceService
这行代码的实际含义是:要求DI容器提供**类型为CalculateImportanceService(具体实现类)**的实例,赋值给组件内名为ICalculateImportanceService的属性。
但你在Startup.cs里的服务注册逻辑是:
services.AddScoped<ICalculateImportanceService, CalculateImportanceService>();
这个注册仅声明了「当请求ICalculateImportanceService接口类型的服务时,返回CalculateImportanceService的实例」,并没有将CalculateImportanceService这个具体类本身注册为可直接解析的服务类型,因此DI容器找不到对应类型,抛出了你看到的InvalidOperationException错误。
按照依赖抽象的仓储模式设计思路,直接修改CalculateItemImportance.razor中的@inject语句,将服务类型替换为你注册的接口即可:
@inject ICalculateImportanceService ICalculateImportanceService
修改后DI容器会根据接口注册映射,自动返回对应的CalculateImportanceService实例,你现有无参数存储过程的执行逻辑无需改动即可正常运行。
补充说明:如果你确实需要直接注入具体实现类
CalculateImportanceService,需要额外在Startup.cs的服务配置段增加一行注册:services.AddScoped<CalculateImportanceService>();但这种写法不符合面向抽象设计的原则,不推荐使用。
- 优化提示:
ICalculateImportanceService.cs文件内存在冗余的using ThePositionerBlazorServerDapperSyncfusion.Data;语句(接口本身就处于该命名空间下),可直接删除,不影响运行逻辑。
内容的提问来源于stack exchange,提问作者Lyndon Sundmark

