【发布时间】:2018-01-11 15:09:41
【问题描述】:
对于 Autofac,注册类型或声明此类圆形图的依赖关系的正确方法是什么?
public interface IComponent
{
void DoSomething();
}
public class AComponent: IComponent
{
...
}
public class BComponent: IComponent
{
...
}
public class CompositeComponent: IComponent
{
public CompositeComponent(IEnumerable<IComponent> components)
{
this.components = components;
}
public void DoSomething()
{
foreach(var component in components)
component.DoSomething();
}
}
最终目标是使 CompositeComponent 成为 IComponent 的默认注册,并简单地将调用传递给所有其他实现。
【问题讨论】:
-
循环性在哪里?
CompositeComponent依赖于AComponent和BComponent,但AComponent和BComponent不依赖于CompositeComponent。你能解释一下这种循环在哪里吗? -
我认为“圆圈”是
CompositeComponent是IComponent的事实,但它还需要接受所有IComponent实例除了本身。我会提供一个答案,但简短的说法是这是一个设计问题。 -
@Steven,我为延迟回复道歉,但 Travis 是正确的。 AComponent 和 BComponent 上没有约束面以及 CompositeComponent 的开放依赖关系导致 CompositeComponent 对其自身的循环依赖。我们可以在 CompositeComponent 的注册中使用元数据或键控服务来正确约束注入。
标签: autofac