我在结构图中有最简单的循环依赖关系-类A依赖于其构造函数中的类B,而类B依赖于其构造函数中的类A。为了打破依赖关系,我让类B将类A作为属性,而不是构造函数参数,但是structuremap仍然提示。
我已经看到在其他DI框架中使用此方法破坏了循环依赖关系-这是Structuremap的问题还是我做错了什么?
编辑:
我应该提到,类B的属性是类A实例的数组,其连接方式如下:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
为了澄清起见,我希望发生以下事件序列:
我希望如果可能的话,使用 Autowiring 来实现所有这些...
编辑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 ...的双向依赖性问题”。
最佳答案
您可以得到的最接近的东西是这样的:
x.For<IB>().Use<B>()
.OnCreation((ctx, instance) =>
{
instance.ArrayOfA = new IA[] {new A(instance) };
});
如果
A
还有其他要从容器中解析的依赖项,则可以从OnCreation lambda的ctx
中检索它们。关于c# - StructureMap中的循环依赖关系-可以通过属性注入(inject)来打破它们吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2782299/