继承 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 层次结构,只需要注册您使用的最终类型。
我希望注册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 层次结构,只需要注册您使用的最终类型。