Blazor Server后台代码通过DI无法创建服务实例问题求助
问题排查与解决
1. 确认Autofac是否正确替换Blazor的默认服务提供器
Blazor Server默认使用内置DI,若集成Autofac但未正确替换服务提供器,内置DI无法解析构造函数中的依赖,会尝试调用无参构造函数,从而触发异常。
检查Program.cs的配置,确保包含以下关键步骤:
var builder = WebApplication.CreateBuilder(args); // 替换为Autofac服务提供器工厂 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); // 配置Autofac容器 builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder => { // 注册自定义模块 containerBuilder.RegisterModule<PresentationAutofacModule>(); }); // 常规Blazor配置 builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); // 注意:若已通过Autofac注册ICustomerService,不要在此重复用builder.Services.AddScoped注册,避免冲突
2. 检查组件构造函数的访问修饰符
确保Customers组件的构造函数为public,Blazor需要通过公共构造函数实例化组件:
public class Customers : ComponentBase { private readonly ICustomerService _customerService; // 必须是public修饰符 public Customers(ICustomerService customerService) { _customerService = customerService; } // 属性注入需配合Autofac配置,Blazor内置DI不支持属性注入 [Inject] public ICustomerViewModel CustomerViewModel { get; set; } }
3. 配置Autofac支持属性注入(若使用属性注入)
Blazor内置DI不支持属性注入,若你使用了[Inject]属性,需在PresentationAutofacModule中开启属性注入:
public class PresentationAutofacModule : Module { protected override void Load(ContainerBuilder builder) { // 注册程序集内的接口实现(原有逻辑) builder.RegisterAssemblyTypes(typeof(PresentationAutofacModule).Assembly) .AsImplementedInterfaces() .InstancePerLifetimeScope(); // 为Blazor组件开启属性注入 builder.RegisterAssemblyTypes(typeof(Customers).Assembly) .Where(t => t.IsSubclassOf(typeof(ComponentBase))) .PropertiesAutowired(); } }
4. 验证依赖服务的注册完整性
确认ICustomerService的实现类已在PresentationAutofacModule中正确注册,或已单独在Autofac容器中注册,避免因服务未注册导致DI无法解析构造函数参数。
内容的提问来源于stack exchange,提问作者TheBoubou
相关产品推荐
相关产品推荐

