Autofac依赖注入实现MVC项目WebAPI接口无报错但数据未入库问题
问题核心原因
- 你当前的
EfUnitOfWork中实例化Dal层对象时没有传入持有的ATKlogMSSqlContext,导致添加数据操作和保存操作使用的是完全独立的两个DbContext实例,自然无法将数据持久化到数据库 - 服务生命周期配置不匹配:
EfUnitOfWork注册为单例,但ATKlogMSSqlContext是请求级作用域,单例UoW只会初始化一次DbContext,后续请求的上下文要么已被释放要么状态异常,也会导致数据无法正常保存
修复步骤
1. 修正EfUnitOfWork的Dal实例化逻辑
你直接new出来的EfArticleDal等Dal对象,内部使用的是自己初始化的DbContext,和UoW中持有的_context不是同一个实例,需要把_context传入Dal的构造函数:
// 假设你的EfXXXDal构造函数都支持传入ATKlogMSSqlContext参数,修改属性初始化逻辑 public IArticleDal Articles => _efArticleDal ??= new EfArticleDal(_context); public ICategoryDal Categories => _efCategoryDal ??= new EfCategoryDal(_context); public ICommentDal Comments => _efCommentDal ??= new EfCommentDal(_context); public IRoleDal Roles => _efRoleDal ??= new EfRoleDal(_context); public IUserDal Users => _efUserDal ??= new EfUserDal(_context);
同时确认所有EfXXXDal的构造函数正确接收并使用传入的DbContext进行数据操作,不要在Dal内部自行new新的DbContext。
2. 修正Autofac的生命周期配置
修改AutofacBusinessModule中UoW和批量服务的注册规则,和DbContext的请求级作用域保持一致:
// 把UoW从SingleInstance改成InstancePerLifetimeScope,每个请求对应一个UoW实例 builder.RegisterType<EfUnitOfWork>().As<IUnitOfWork>().AsSelf().InstancePerLifetimeScope(); // 批量注册的服务也同步调整生命周期,避免单例服务依赖请求级服务引发的生命周期不匹配问题 var assembly = System.Reflection.Assembly.GetExecutingAssembly(); builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces() .EnableInterfaceInterceptors(new ProxyGenerationOptions() { Selector = new AspectInterceptorSelector() }).InstancePerLifetimeScope();
修改完成后重新运行即可正常将数据存入数据库。
内容的提问来源于stack exchange,提问作者ATK
相关产品推荐
相关产品推荐

