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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:36:03