Autofac继承类属性注入失败,ClassA属性为null如何修改代码
问题原因
你配置无效的核心原因是实际注入的TestRepository实例的注册逻辑没有开启属性自动注入,你单独给基类RepositoryBase加的PropertiesAutowired不生效,因为你不会直接解析RepositoryBase实例,你依赖的是ITestRepository对应的TestRepository子类实例。
解决方案
方案1:给Repository扫描注册逻辑开启属性注入(推荐)
修改你的ContainerModule代码如下:
public class ContainerModule : Module { protected override void Load(ContainerBuilder builder) { var assembly = Assembly.GetExecutingAssembly(); builder.RegisterAssemblyTypes(assembly) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces() .InstancePerLifetimeScope() // 新增这行,开启所有Repository实现类的属性自动注入 .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies); builder.RegisterType<ClassA>().InstancePerLifetimeScope(); // 删掉原来单独注册RepositoryBase的代码,无实际作用 } }
方案2:手动指定仅给RepositoryBase子类注入ClassA
如果你不想全局开启Repository的属性注入,可以通过激活回调手动赋值:
public class ContainerModule : Module { protected override void Load(ContainerBuilder builder) { var assembly = Assembly.GetExecutingAssembly(); builder.RegisterAssemblyTypes(assembly) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces() .InstancePerLifetimeScope() // 新增激活回调,手动给RepositoryBase子类的ClassA赋值 .OnActivated(e => { if (e.Instance is RepositoryBase repo) { repo.ClassA = e.Context.Resolve<ClassA>(); } }); builder.RegisterType<ClassA>().InstancePerLifetimeScope(); } }
注意事项
- 你当前已经单独注册了ClassA,这一步是正确的,属性注入的目标类型必须先在容器中完成注册。
- 确保要注入的属性有public的set访问器,你当前的ClassA属性符合要求。
内容的提问来源于stack exchange,提问作者beiduoan
相关产品推荐
相关产品推荐

