基于ABP框架的DDD项目Autofac依赖注入异常排查求助
ABP框架依赖注入异常排查与解决
问题描述
使用ABP框架实现DDD项目(技术栈:.NET6、Telerik Blazor、MSSQL),严格遵循ABP教程搭建,但出现Autofac依赖注入异常,无法解析CustomerAppService构造函数中的ICustomerRepository参数,导致CustomerGrid组件激活失败。
报错信息
Error: Autofac.Core.DependencyResolutionException: An exception was thrown while activating A.Blazor.Pages.Shared.CustomerGrid -> A.Customers.CustomerAppService. ---> Autofac.Core.DependencyResolutionException: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'A.Customers.CustomerAppService' can be invoked with the available services and parameters: Cannot resolve parameter 'A.Customers.ICustomerRepository customerRepository' of constructor 'Void .ctor(A.Customers.ICustomerRepository)'. at Autofac.Core.Activators.Reflection.ReflectionActivator.\<\>c__DisplayClass12_0.\<UseSingleConstructorActivation\>b__0(ResolveRequestContext ctxt, Action`1 next) at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.<PropertiesAutowired>b__0(ResolveRequestContext ctxt, Action`1 next) at Autofac.Extras.DynamicProxy.RegistrationExtensions.\<\>c__DisplayClass8_0`3.\<EnableInterfaceInterceptors\>b__1(ResolveRequestContext ctxt, Action`1 next) at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) --- End of inner exception stack trace --- at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters) at Blazorise.ComponentActivator.CreateInstance(Type componentType) at Microsoft.AspNetCore.Components.ComponentFactory.InstantiateComponent(IServiceProvider serviceProvider, Type componentType) at Microsoft.AspNetCore.Components.RenderTree.Renderer.InstantiateChildComponentOnFrame(RenderTreeFrame& frame, Int32 parentComponentId) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext& diffContext, Int32 frameIndex) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext& diffContext, Int32 frameIndex) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext& diffContext, Int32 newFrameIndex) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext& diffContext, Int32 newFrameIndex) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext& diffContext, Int32 newFrameIndex) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext& diffContext, Int32 oldStartIndex, Int32 oldEndIndexExcl, Int32 newStartIndex, Int32 newEndIndexExcl) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer renderer, RenderBatchBuilder batchBuilder, Int32 componentId, ArrayRange`1 oldTree, ArrayRange`1 newTree) at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, Exception& renderFragmentException) at Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()
问题排查
- 自定义仓储未注册到DI容器:ABP默认仅自动注册符合约定的仓储(如继承自
IRepository<T>的默认仓储),但自定义的ICustomerRepository需要手动注册实现类CustomerRepository。 - 模块未扫描到仓储所在程序集:若
CustomerRepository所在程序集未被ABP模块扫描,DI容器无法发现该实现。 - SQL语句语法错误:
CustomerRepository中的SQL语句末尾多了一个),会导致后续数据库查询失败(虽不影响当前DI问题,但需一并修正)。
解决方案
方案一:手动注册自定义仓储
在AEntityFrameworkCoreModule的ConfigureServices方法中,添加ICustomerRepository与CustomerRepository的映射注册:
public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAbpDbContext<ADbContext>(options => { options.AddDefaultRepositories(includeAllEntities: true); }); // 注册自定义仓储 context.Services.AddTransient<ICustomerRepository, CustomerRepository>(); }
方案二:自动扫描仓储所在程序集
若仓储与模块不在同一程序集,可通过AddAssemblyOf方法扫描指定类型所在的程序集,自动注册所有符合条件的服务:
public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAbpDbContext<ADbContext>(options => { options.AddDefaultRepositories(includeAllEntities: true); }); // 扫描CustomerRepository所在的程序集,自动注册服务 context.Services.AddAssemblyOf<CustomerRepository>(); }
附加修正:SQL语句语法错误
修改CustomerRepository中的SQL语句,移除多余的):
builder.AppendFormat(@" SELECT cust_id, name FROM T_CUSTOMER;");
验证步骤
- 重新编译并启动项目。
- 访问使用
CustomerGrid组件的页面,检查依赖注入是否正常工作。 - 测试下拉框数据加载,确认数据库查询返回正确结果。
内容的提问来源于stack exchange,提问作者peachApeach
相关产品推荐
相关产品推荐

