继承 class 属性 使用 autofac 注入

Inherited class property injection with autofac

我希望注册autofac 属性 注入,但是不能工作ClassA 属性 = null.Not 注入成功,如何更改我的代码

public interface IRepository
{
}

public class Repository : IRepository
{
    public Repository()
    {

    }

}

这是我的基地class

public class RepositoryBase : Repository
{
    public ClassA ClassA { get; set; }
    public RepositoryBase()
    {
            
    }

    public void Print()
    {
        ClassA.Exec();
    }
}

//属性注入是否需要注入ClassA?

public class ClassA
    {
        public ClassA()
        {

        }

        public void Exec()
        {
            Console.WriteLine("Test");
        }
    }

调用方法

public interface ITestRepository
{
    void ExecPrint();
}

public class TestRepository : RepositoryBase, ITestRepository
{
    public TestRepository()
    {

    }

    public void ExecPrint()
    {
        Print();
    }
}

这是我的 autofac 注册码

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()
                    ;
    
                builder.RegisterType<ClassA>().InstancePerLifetimeScope();
        builder.RegisterType<RepositoryBase>().InstancePerLifetimeScope().PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
            }
        }

call Screenshots

RepositoryBase ClassA 属性 = null

您正在为基本类型 class 指定 PropertiesAutowired,但没有为主要类型指定 PropertiesAutowired。

因此将您的注册更改为:

var assembly = Assembly.GetExecutingAssembly();
        builder.RegisterAssemblyTypes(assembly)
            .Where(t => t.Name.EndsWith("Repository"))
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope()
            .PropertiesAutowired()
            ;

builder.RegisterType<ClassA>().InstancePerLifetimeScope();

将确保最终实施确实收到 属性。

此外,我猜你会通过以下方式解决:

var container = builder.Build();
var test = container.Resolve<ITestRepository>();
test.ExecPrint();

您不需要注册 RepositoryBase,autofac 不需要注册完整的 class 层次结构,只需要注册您使用的最终类型。