我在结构图中有最简单的循环依赖 - 类A在其构造函数中依赖于类B,而类B在其构造函数中依赖于类A.为了打破依赖,我让B类将A类作为属性,而不是构造函数参数,但是structmap仍然抱怨。
我在其他DI框架中看到使用此方法破坏了循环依赖 - 这是Structuremap的问题还是我做错了什么?
修改: 我应该提一下,B类的属性是一个A类实例的数组,如下所示:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
为了澄清,我希望发生以下事件序列:
如果可能的话,我希望所有这一切都发生在使用自动装配......
编辑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 ...”
答案 0 :(得分:6)
StructureMap可以使用延迟解析来解决双向情况。
如果您的ClassA
这样的简单情况取决于依赖于ClassB
的{{1}}和ClassB
,那么您可以选择其中一个并将依赖关系转换为懒惰的依赖。这种方式对我有用,而且这个错误再也没有出现过..
ClassA
此处有更多信息:http://structuremap.github.io/the-container/lazy-resolution/
答案 1 :(得分:3)
你能得到的最接近的是:
x.For<IB>().Use<B>()
.OnCreation((ctx, instance) =>
{
instance.ArrayOfA = new IA[] {new A(instance) };
});
如果A
包含您要从容器中解析的其他依赖项,则可以从OnCreation lambda中的ctx
检索它们。
答案 2 :(得分:0)
StructureMap可能正在执行Setter Injection,它将在其正在解析的对象上填充公共可设置属性。根据文件,
默认情况下,所有公共“Setter”都是可选的,这意味着只有在为特定实例显式配置这些setter时才会设置这些setter
您是否有机会将属性设置为自动连线?如果是这样,你仍然会遇到循环依赖问题。
编辑:我知道你有。在你的实例中因为B注入了A [],StructureMap必须解析每个A对需要A []的B的依赖关系,依此类推......