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

Blazor应用中Semantic Kernel插件依赖注入(DI)报错:无法从根提供程序解析作用域服务ISearchService

Blazor应用中Semantic Kernel插件依赖注入(DI)报错:无法从根提供程序解析作用域服务ISearchService

嘿,这个问题我之前在做Semantic Kernel和Blazor集成的时候也碰到过,其实就是服务生命周期不匹配搞出来的问题,我给你拆解一下原因和解决办法:

为啥会报错?

你把ISearchService注册成了Scoped(作用域)服务——这类服务是每个请求/Blazor组件作用域才会创建的。但你用.Plugins.AddFromType<SearchPlugin>()注册Semantic Kernel插件时,默认是把插件当成Singleton(单例)服务来注册的。

单例服务是从「根服务提供程序」创建的,它的生命周期和整个应用绑定。而根提供程序根本没办法解析Scoped服务——因为Scoped服务只存在于某个特定的作用域里,根容器没有对应的上下文,自然就报这个错了。

最快的修复方案(推荐)

你只需要改两处代码,让插件和依赖的服务生命周期对齐:

  1. 把插件注册为Scoped服务
    修改你注册Kernel插件的代码,显式指定插件的生命周期为Scoped:
services.AddSemanticKernel(configuration)
        // 这里加上ServiceLifetime.Scoped参数
        .Plugins.AddFromType<SearchPlugin>(ServiceLifetime.Scoped);
  1. 把Kernel也注册为Scoped服务(更稳妥)
    默认情况下AddKernel()是把IKernel注册成单例的,单例的Kernel持有Scoped插件可能会导致后续的内存泄漏或者EF Core DbContext的问题(如果你用了EF的话)。所以你需要修改你的AddSemanticKernel扩展方法:
public static IKernelBuilder AddSemanticKernel(this IServiceCollection services, IConfiguration configuration)
{
    var modelId = "llama3.2:3b";
    var endpoint = new Uri("http://localhost:11424");
    services.AddOllamaChatCompletion(modelId, endpoint);
    // 把Kernel的生命周期改成Scoped,和插件对齐
    return services.AddKernel(ServiceLifetime.Scoped);
}

这样一来,插件和Kernel的生命周期都和ISearchService一致,都是Scoped的,依赖注入就能正常工作了。

其他可选方案(谨慎使用)

如果你的SearchService不依赖任何Scoped服务(比如没有用EF Core的DbContext),你也可以把ISearchService改成单例注册:

// 注意:如果SearchService依赖DbContext,绝对不能这么干!会出大问题!
services.AddSingleton<ISearchService, SearchService>();

但这个方案风险比较高,除非你完全确定你的搜索服务没有状态、不依赖其他Scoped组件,不然还是推荐前面的方案。

我当初就是这么解决的,改完之后重启应用就没报错了,你试试看~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 08:18:07