【问题标题】:Autofac Circular Dependency With EnumerationAutofac 循环依赖与枚举
【发布时间】:2017-07-12 17:07:55
【问题描述】:

我有一些如下形式的代码:

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 告诉我它们的依赖为空。

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

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;即,无论做什么,似乎都没有正确解决。我有点不知所措如何解决这种依赖关系。

【问题讨论】:

    标签: c# autofac


    【解决方案1】:

    PropertiesAutowired 方法需要 Public 设置器属性。

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

    您可以在DefaultPropertySelector.cs 源代码(第 48 行)上看到它


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 2020-01-13
      • 2012-05-25
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多