我在结构映射中有最简单的循环依赖——A 类在其构造函数中依赖于 B 类,B 类在其构造函数中依赖于 A 类。为了打破依赖关系,我让 B 类将 A 类作为属性,而不是构造函数参数,但结构映射仍然抱怨。
我已经看到在其他 DI 框架中使用这种方法破坏了循环依赖关系——这是 Structuremap 的问题还是我做错了什么?
编辑: 我应该提到 B 类的属性是 A 类实例的数组,连接如下:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
澄清一下,我希望发生以下事件序列:
- 构造一个B的实例,“b”
- 构造 A 的实例“a”,将“b”注入其构造函数
- 将 "b.ArrayOfA" 设置为 ["a"]
如果可能的话,我希望所有这一切都使用自动装配来发生......
编辑2:这是一个使用显式接线的简化示例:
interface ILoader { }
interface ILoaderManager { }
class Loader : ILoader
{
public Loader(ILoaderManager lm) { }
}
class LoaderManager : ILoaderManager
{
public ILoader Loader { get; set; } // Was an array, but same circular dependency appears here
}
ObjectFactory.Configure
(
x =>
{
x.For<ILoader>.Singleton().Use<Loader>();
x.For<ILoaderManager>().Singleton().Use<LoaderManager>().OnCreation((c, a) => a.Loader = c.GetInstance<ILoader>());
}
);
验证配置会导致“使用 RequestedType 检测到双向依赖问题:IocTest2.ILoader ...”