项目
版本

Autofac 循环依赖

循环依赖是指组件之间的运行时相互依赖。

属性/属性依赖

当一个类 ( DependsByProperty1 ) 依赖于另一个类型的属性 ( DependsByProperty2 ),而这种依赖反过来又存在于 ( DependsByProperty2 ) 的属性中时,就会出现这种情况。

在这种情况下,请记住以下几点:

  • 使属性依赖可设置。 属性必须是可写入的。
  • 使用 PropertiesAutowired 注册类型。 确保允许循环依赖行为。
  • 两种类型都不能注册为 InstancePerDependency 如果任何类型设置为工厂作用域,您将无法得到期望的结果(即两个类型相互引用)。您可以按任意方式进行作用域设置——如 SingleInstanceInstancePerLifetimeScope 或其他任何作用域,但不能是工厂作用域。

示例:

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 如果任何类型设置为工厂作用域,您将无法得到期望的结果(即两个类型相互引用)。您可以按任意方式进行作用域设置——如 SingleInstanceInstancePerLifetimeScope 或其他任何作用域,但不能是工厂作用域。

示例:

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 扩展和一些创造性编程来解决这个问题。

在本文档中