Autofac循环依赖与枚举

时间:2017-07-12 17:07:55

标签: c# autofac

我有以下形式的代码:

class DependsOnEnumerations : IDependsOnEnumerations{
  IEnumerable<IDependsOnEnumerator> dependencies;
}
...
interface IDependsOnEnumerator{
}
...
class DependencyA: IDependsOnEnumerator{
  IDependsOnEnumerations dependency;
}
...
class DependencyB: IDependsOnEnumerator{
  IDependsOnEnumerations dependency;
}
...

我想使用Autofac来正确解析这个依赖项,它是循环的并且有一个枚举。

到目前为止,我尝试将两组依赖项声明为属性:

class DependsOnEnumerations : IDependsOnEnumerations{
  internal IEnumerable<IDependsOnEnumerator> dependencies { get; set;}
}
...
class DependencyA: IDependsOnEnumerator{
  internal IDependsOnEnumerations dependency {get; set;}
}
...

然后使用

在Autofac中注册
builder.registerType<DependsOnEnumerations>
.AsImplementedInterfaces()
.InstancePerLifetimeScope()
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
builder.registerType<DependencyA>
.AsImplementedInterfaces()
.SingleInstance()
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
builder.registerType<DependencyB>
.AsImplementedInterfaces()
.SingleInstance()
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
...

这里发生的是DependencyA和DependencyB告诉我他们的依赖是null。

我也尝试将其中一个声明为属性:

class DependsOnEnumerations : IDependsOnEnumerations{
  private readonly IEnumerable<IDependsOnEnumerator> _dependencies;

  internal DependsOnEnumerations(IEnumerable<IDependsOnEnumerator> dependencies){
    _dependencies = dependencies;
  }
}
...
class DependencyA: IDependsOnEnumerator{
  internal IDependsOnEnumerations dependency {get; set;}
}
...

class DependsOnEnumerations : IDependsOnEnumerations{
  internal IEnumerable<IDependsOnEnumerator> dependencies { get; set;}
}
...
class DependencyA: IDependsOnEnumerator{
  private readonly IDependsOnEnumerations _dependency;

  internal DependencyA(IDependsOnEnumerations dependency){
    _dependency = dependency;
  }
}
...

在第一种情况下,可枚举为n​​ull,在第二种情况下,依赖为null;即无论是什么,财产似乎都没有得到妥善解决。我有点不知道如何解决这种依赖关系。

1 个答案:

答案 0 :(得分:1)

PropertiesAutowired方法需要Public setter属性。

class DependencyA: IDependsOnEnumerator{
  public IDependsOnEnumerations dependency {get; set;}
}

您可以在this thread源代码(第48行)

上看到它

顺便说一下,你应该重构你的设计以避免循环依赖。这种依赖会使您的代码更难理解。如果两个组件彼此需要,那么合并这些组件或创建第三个组件以打破这种循环依赖可能更简单。