Autofac 循环依赖
循环依赖是指组件之间的运行时相互依赖。
属性/属性依赖
当一个类 ( DependsByProperty1
) 依赖于另一个类型的属性 ( DependsByProperty2
),而这种依赖反过来又存在于 ( DependsByProperty2
) 的属性中时,就会出现这种情况。
在这种情况下,请记住以下几点:
- 使属性依赖可设置。 属性必须是可写入的。
- 使用
PropertiesAutowired
注册类型。 确保允许循环依赖行为。- 两种类型都不能注册为
InstancePerDependency
。 如果任何类型设置为工厂作用域,您将无法得到期望的结果(即两个类型相互引用)。您可以按任意方式进行作用域设置——如SingleInstance
、InstancePerLifetimeScope
或其他任何作用域,但不能是工厂作用域。
示例:
class DependsByProp1
{
public DependsByProp2 Dependency { get; set; }
}
class DependsByProp2
{
public DependsByProp1 Dependency { get; set; }
}
// ...
var cb = new ContainerBuilder();
cb.RegisterType<DependsByProp1>()
.InstancePerLifetimeScope()
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
cb.RegisterType<DependsByProp2>()
.InstancePerLifetimeScope()
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
构造函数/属性依赖
当一个类 ( DependsByCtor
) 通过构造函数依赖于另一个类型 ( DependsByProperty
) ,而这种依赖反过来又存在于 ( DependsByProperty
) 的属性中时,就会出现这种情况。
在这种情况下,请记住以下几点:
- 使属性依赖可设置。 具有属性依赖的类型上的属性必须是可写入的。
- 使用
PropertiesAutowired
注册具有属性依赖的类型。 确保允许循环依赖行为。- 两种类型都不能注册为
InstancePerDependency
。 如果任何类型设置为工厂作用域,您将无法得到期望的结果(即两个类型相互引用)。您可以按任意方式进行作用域设置——如SingleInstance
、InstancePerLifetimeScope
或其他任何作用域,但不能是工厂作用域。
示例:
class DependsByCtor
{
public DependsByCtor(DependsByProp dependency) { }
}
class DependsByProp
{
public DependsByCtor Dependency { get; set; }
}
// ...
var cb = new ContainerBuilder();
cb.RegisterType<DependsByCtor>()
.InstancePerLifetimeScope();
cb.RegisterType<DependsByProp>()
.InstancePerLifetimeScope()
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
构造函数/构造函数依赖
具有循环构造函数依赖的两个类型 不被支持。尝试使用这种方式注册类型时,会抛出异常。
您可以尝试使用 DynamicProxy2 扩展和一些创造性编程来解决这个问题。